2

我在 Vaadin 应用程序中使用 Spring 和 Spring-Security。

我想使用SecurityContextHolderAwareRequestWrapper.isUserInRole(...)检查用户是否具有特定角色,但无法弄清楚如何获取对包装器的引用(我尝试使用 @Autowired 注入它,注意:我没有手动配置实例我相信 DelegatingFilterProxy 已经在幕后这样做了)。

这个堆栈溢出问题为我提供了解决方案,但我无法发现如何正确访问或实例化包装器。

我的另一种选择是直接访问 SecurityContext 并根据链接的 SO 问题中的其他建议通过 GrantedAuthorities 进行迭代。

我应该如何访问/实例化包装器?

4

1 回答 1

5

它应该开箱即用,至少在 Spring Security 3.1HttpServletRequest中(安全链中的每个都应该是 的实例SecurityContextHolderAwareRequestWrapper)。

servlet-api-provision<http>元素的属性添加到堆栈:

提供 HttpServletRequest 安全方法的版本,例如 isUserInRole() 和 getPrincipal(),它们是通过将 SecurityContextHolderAwareRequestFilter bean 添加到堆栈来实现的。默认为真。

过滤器很简单,SecurityContextHolderAwareRequestFilter只包含:HttpServletRequestSecurityContextHolderAwareRequestWrapper

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
    chain.doFilter(new SecurityContextHolderAwareRequestWrapper(
            (HttpServletRequest) req, rolePrefix), res);
}

(注意错误 #SEC-1943 - 过滤器分配给别名的名称错误SERVLET_API_SUPPORT_FILTER。)

于 2012-07-04T10:47:09.047 回答