在一个方法上组合@Secured和@PreAuthorize注释

时间:2017-03-22 23:14:05

标签: java spring spring-mvc spring-security

我的应用程序中有以下服务方法:

    @Override
    @Secured({Authority.ACCESS_FUNDING})
    @PreAuthorize("hasPermission(principal, 'MODIFY')")
    public FundingAllocation newFundingAllocation(FundingAllocationForm fundingAllocationForm) {
      return newFundingAllocation(fundingAllocationForm, null);
    }

但我注意到@Secured注释被忽略了,只进行了@PreAuthorize检查。

我有以下spring安全配置:

  <security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled">
    <security:expression-handler ref="securityExpressionHandler"/>
  </security:global-method-security>

有人知道是否可以在一种方法上结合注释?

2 个答案:

答案 0 :(得分:3)

根据DelegatingMethodSecurityMetadataSource上的Javadoc,它将使用它找到的第一个元数据源。所以它并不打算将两者混合在一起。理由也在https://github.com/spring-projects/spring-security/issues/2116

中解释

official docs也声明:

  

您可以在同一个中启用多种类型的注释   应用程序,但任何接口或只应使用一种类型   因为行为不会明确定义。如果两个   找到适用于特定方法的注释,然后仅适用   其中一个将被应用。

所以,不要在@PreAuthorize中写下正确的表达方式:

@PreAuthorized("hasAuthority('ACCESS_FUNDING') and hasPermission(principal, 'MODIFY')")

正如jmw5598&#39; s answer建议的那样。

答案 1 :(得分:1)

使用@PreAuthorize@PostAuthorize,您可以将表达式与andor运算符结合使用。

@Override
@PreAuthorized("hasAuthority('ACCESS_FUNDING') and hasPermission(principal, 'MODIFY')")
public FundingAllocation newFundingAllocation(FundingAllocationForm fundingAllocationForm) {
  return newFundingAllocation(fundingAllocationForm, null);
}

希望这很有帮助。

http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html