Spring Security sec:使用Java Config授权标记

我目前正在开发一个用例,我需要使用以下Spring Security taglib来显示(或不显示)基于用户权限的链接。

      

在查看日志时,我发现在谈到日志时没有任何反应

  

无论我的角色如何,我总是看到按钮。 当我使用hasRole时,它可以工作,所以我肯定错过了的工作。

在阅读Spring Security参考的以下部分时:

要使用此标记,还必须在应用程序上下文中有一个WebInvocationPrivilegeEvaluator实例。 如果您使用命名空间,将自动注册。

…问题是该引用不包括Java Config。 所以我想我只需要在SecurityConfig类中定义一个@Bean ,就像这样:

 @Bean public WebInvocationPrivilegeEvaluator webInvocationPrivilegeEvaluator() { return new DefaultWebInvocationPrivilegeEvaluator(); } 

…但是,它需要一个FilterSecurityInterceptor实例,我已经在日志中看到了它。 事实上,它已经是我的filter链的一部分,所以我想知道如何在上面的DefaultWebInvocationPrivilegeEvaluator构造函数中引用它?

Spring Security 3.2.4.RELEASE参考: http ://docs.spring.io/spring-security/site/docs/3.2.4.RELEASE/reference/htmlsingle/#the-authorize-tag

谢谢

要获取FilterSecurityInterceptor的实例,您只需要为@Bean -annotated方法添加一个参数,spring将执行魔术(它将找到匹配的bean并将其作为参数传递给方法):

 @Bean public WebInvocationPrivilegeEvaluator webInvocationPrivilegeEvaluator(FilterSecurityInterceptor filterSecurityInterceptor) { return new DefaultWebInvocationPrivilegeEvaluator(filterSecurityInterceptor); } 

但这不会解决你的问题。 使用java配置时,spring会自动创建WebInvocationPrivilegeEvaluator bean,因此无需手动创建它。 实际上,如果上下文中没有WebInvocationPrivilegeEvaluator bean,则sec:authorize标记会抛出exception 。

我相信你的问题是由url属性的错误使用引起的。 它的值应该是一个内部URL,比如/security/user/create ,但是你使用的是标记的结果,它将上下文路径附加到该URL(如/context/security/user/create ) 。

另一种可能性是你没有配置spring-security来实际保护/security/user/create url,但我认为并非如此。