基于所有者用户的实体访问权限

时间:2013-07-10 14:34:08

标签: spring spring-mvc spring-security

我正在使用spring security开发Spring MVC webapp。

根据记录的用户和当前访问的实体,我必须允许或拒绝用户查看或修改它。如果用户创建了实体,则他是所有者,并且他可以处理该实体。我可以验证它,因为entity.user == user。

我还有这样的情况,即只能通过获取实体的父级或n-parent来比较用户。例如entity.nestedEntity.user == user

我已经看到Spring安全性有ACL支持(域对象安全性),但我认为我无法处理“父方案”。而且我不是从一个空数据库开始。另外我认为我需要为每个对象构建acl ..所以我认为这不是正确的方法。

到目前为止,我检查控制器层,获取当前用户并将其与存储在请求对象中的用户进行比较。如果它们不相同,我会抛出一个AccessDeniedException。

为了让事情尽可能简单,我可以采取哪些替代方法?

谢谢Marco

1 个答案:

答案 0 :(得分:6)

您可以实现自己的PermissionEvaluator,它将检查您的自定义权限逻辑。 然后,您使用Spring Security注册新创建的PermissionEvaluator,您可以使用 您在Spring Security注释中的自定义权限检查。

最小示例(spring security config):

<!-- 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)' )等等......