我在Vaadin应用程序中使用Spring和Spring-Security。
我想检查用户是否使用SecurityContextHolderAwareRequestWrapper.isUserInRole(...)具有某个角色,但无法弄清楚如何获取对包装器的引用(我尝试使用@Autowired注入此内容,注意:我没有手动配置实例因为我相信DelegatingFilterProxy已经在幕后做了这个。)
This堆栈溢出问题为我提供了解决方案,但我无法揭示如何正确访问或实例化包装器。
我的另一种选择是直接访问SecurityContext并按照链接的SO问题中的其他建议迭代GrantedAuthorities。
我应该如何访问/实例化包装器?
答案 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
。)