我的应用程序中有以下服务方法:
@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>
有人知道是否可以在一种方法上结合注释?
答案 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
,您可以将表达式与and
和or
运算符结合使用。
@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