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 时,它​​可以工作,所以我肯定缺少 &lt;sec:authorize url="..." /&gt; 工作的东西。

在阅读 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,但您使用的是 &lt;spring:url&gt; 标记的结果,它将上下文路径附加到该 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 授权标签的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security sec:授权抛出异常

sec:authorize 对 Spring Security 不起作用

<sec:authorize ifAnyGranted 或 ifAnyGranted 在 SPRING SECURITY 中不起作用

Spring Security Role Hierarchy 不适用于 Thymeleaf sec:authorize

Spring Boot Security - Thymeleaf sec:授权不起作用

sec:authentication 在 Spring Boot Security 中不起作用