您可以实现自己的 PermissionEvaluator 来检查您的自定义权限逻辑。然后,您向 Spring Security 注册新创建的 PermissionEvaluator,您可以在 Spring Security 注释中使用您的自定义权限检查。
最小示例(弹簧安全配置):
<!-- Enable usage of @Pre & @Post security annotations -->
<global-method-security secured-annotations="enabled" pre-post-annotations="enabled">
<expression-handler ref="expressionHandler"/>
</global-method-security>
<!-- Use CustomPermissionEvaluator as permission evaluator to control access to application with specific permission rules -->
<beans:bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
<beans:property name="permissionEvaluator" ref="customPermissionEvaluator"/>
</beans:bean>
<beans:bean id="customPermissionEvaluator" class="com.example.CustomPermissionEvaluator">
然后您的 CustomPermissionEvalutor 应该具有 hasPermission 实现,该实现对您的自定义“OWNER”权限和您的自定义域对象进行权限检查。
像这样的东西:
@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
...
if ("OWNER".equals(permission.toString()) && targetDomainObject instanceof Entity) {
//fetch user from Authentication and verify if user is owner of Entity
}
...
}
最后,您将能够使用注释强制执行安全性:
@PreAuthorize("hasPermission(#someEntity, 'OWNER')")
public someMethod(Entity someEntity) { ... }
也可以(但更复杂)添加可以在 Spring Security 注释中评估的新函数,在这种情况下,您可以添加自己的 isOwner 函数,PreAuthorize 可能看起来像 @PreAuthorize('isOwner(#someEntity)') 等。 ..