1

我正在开发一个 Spring MVC webapp,也使用 spring 安全性。

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

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

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

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

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

谢谢马可

4

1 回答 1

6

您可以实现自己的 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)') 等。 ..

于 2013-07-10T16:25:43.760 回答