Spring Security sec:使用 Java Config 授权标签
Posted
技术标签:
【中文标题】Spring Security sec:使用 Java Config 授权标签【英文标题】:Spring Security sec:authorize tag using Java Config 【发布时间】:2016-09-24 19:07:17 【问题描述】:我目前正在开发一个用例,我需要使用以下 Spring Security 标签库来显示(或不显示)基于用户权限的链接。
<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
谢谢
【问题讨论】:
您能否向我们展示您为保护 URL 所做的安全配置 @SangramJadhav:就这么简单:@PreAuthorize("hasRole('ADMINISTRATOR')")
在控制器方法上。当我尝试通过单击按钮/链接访问此方法时,它可以工作。通过工作,我的意思是我收到了预期的 HTTP 403 错误,因为我不应该访问该功能。
【参考方案1】:
要获得FilterSecurityInterceptor
的实例,您只需向您的@Bean
-annotated 方法添加一个参数,spring 会发挥作用(它会找到匹配的 bean 并将其作为参数传递给方法) :
@Bean
public WebInvocationPrivilegeEvaluator webInvocationPrivilegeEvaluator(FilterSecurityInterceptor filterSecurityInterceptor)
return new DefaultWebInvocationPrivilegeEvaluator(filterSecurityInterceptor);
但是这并不能解决您的问题。使用java config时,spring会自动创建WebInvocationPrivilegeEvaluator
bean,所以不需要手动创建。事实上,如果上下文中没有 WebInvocationPrivilegeEvaluator
bean,sec:authorize
标签就会抛出 exception。
我认为您的问题是由于 url
属性的错误使用引起的。它的值应该是一个内部 url,如 /security/user/create
,但您使用的是 <spring:url>
标记的结果,它将上下文路径附加到该 url(如 /context/security/user/create
)。
另一种可能性是您没有配置 spring-security 来真正保护 /security/user/create
url,但我认为这里不是这种情况。
【讨论】:
刚刚对其进行了测试,即使我按照您的建议对 URL 进行了硬编码,它也无法正常工作。有趣的是,当我真正点击那个链接时,我得到了一个 HTTP 403(这是正确的)。 那么是时候进行一些调试了。你能分享你的项目或创建一个minimal reproducible example吗? 很遗憾,我无法共享该项目,因为它包含敏感数据和 BI。我可以提供 DEBUG 日志,但我看到的只是 Voter 总是返回1
。
或许你至少可以显示所有相关配置(webapp + spring + spring-security),包括包含@PreAuthorize
注解的控制器骨架?以上是关于Spring Security sec:使用 Java Config 授权标签的主要内容,如果未能解决你的问题,请参考以下文章
sec:authorize 对 Spring Security 不起作用
<sec:authorize ifAnyGranted 或 ifAnyGranted 在 SPRING SECURITY 中不起作用
Spring Security Role Hierarchy 不适用于 Thymeleaf sec:authorize