访问SecurityContextHolderAwareRequestWrapper实例?

时间:2012-07-04 10:01:14

标签: java spring spring-security

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

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

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

我的另一种选择是直接访问SecurityContext并按照链接的SO问题中的其他建议迭代GrantedAuthorities。

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

1 个答案:

答案 0 :(得分:5)

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

servlet-api-provision attribute of <http> element添加到堆栈:

  

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

过滤器SecurityContextHolderAwareRequestFilter很简单,仅在HttpServletRequest中包裹SecurityContextHolderAwareRequestWrapper

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

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