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

时间:2016-05-26 16:38:48

标签: java spring spring-mvc spring-security

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

<spring:url var="createUserURL" value="/security/user/create" />

<sec:authorize url="${createUserURL}">
       <a href="${createUserURL}">
             <spring:message code="button.createUser" />
       </a>
</sec:authorize>

在查看日志时,我发现在

方面没有任何反应
<sec:authorize url="${createUserURL}">

无论我的角色如何,我总是看到按钮。当我使用hasRole时,它可以工作,所以我肯定错过了让<sec:authorize url="..." />工作的东西。

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

  

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

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

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

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

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

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

我认为您的问题是由url属性的错误使用引起的。它的值应该是内部网址,例如/security/user/create,但您使用的是<spring:url>标记的结果,该标记将上下文路径附加到该网址(如/context/security/user/create)。

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