Permissions spring security ACL如何授予权限

Permissions spring security ACL如何授予权限,permissions,spring-security,acl,Permissions,Spring Security,Acl,我目前正在将springs安全性集成到新的web应用程序堆栈中。我们需要能够授予用户或角色访问特定对象或特定类型的所有对象的权限。然而,在阅读文档和示例时,我没有真正了解到这一点: ACL是仅为单个对象向用户/角色授予权限,还是为整个类型授予权限?据我所知,domain object表示类型,但示例和教程似乎为特定对象分配了权限。我只是糊涂了,还是两者都能做到?如果没有,我怎么做其他 谢谢 使用spring security,您可以同时执行这两项操作。这是可能的,因为spring安全性支持所谓的

我目前正在将springs安全性集成到新的web应用程序堆栈中。我们需要能够授予用户或角色访问特定对象或特定类型的所有对象的权限。然而,在阅读文档和示例时,我没有真正了解到这一点:

ACL是仅为单个对象向用户/角色授予权限,还是为整个类型授予权限?据我所知,
domain object
表示类型,但示例和教程似乎为特定对象分配了权限。我只是糊涂了,还是两者都能做到?如果没有,我怎么做其他


谢谢

使用spring security,您可以同时执行这两项操作。这是可能的,因为spring安全性支持所谓的权限规则——在spring安全术语中,他们称之为权限计算器。权限规则包含ACL,但您也可以在对象处于特定状态时保护它们的实例……等等

这就是它的工作原理:

  • 您需要扩展PermissionEvaluator—这允许您使用超级自定义逻辑来确定访问权限—您可以检查对象的类型或特定id,或者检查调用该方法的用户是否是创建该对象的用户,等等:

    公共类SomePermissionsValuator实现PermissionEvaluator{
    @凌驾
    公共布尔hasPermission(身份验证、对象targetDomainObject、对象权限){
    if(permission.equals(“do_something”)&&
    /*身份验证机构的角色为*/){
    返回真值
    }else if(permission.equals(“do_something_else”)&&
    /*身份验证机构具有角色B*/){
    如果targetDomainObject满足某些条件,则返回/*true*/;
    }
    返回false;
    }
    @凌驾
    公共权限(身份验证,
    可序列化的targetId、字符串targetType、对象权限){
    抛出新的UnsupportedOperationException();
    }
    }
    
  • 现在您已经有了安全规则,您需要通过注释应用它:

    @预授权(“hasRole('SOME\u ROLE\u或\u RIGHT')和”+
    “hasPermission(#someDomainObject,'do#u something'))
    public void updateSomeDomainObject(SomeDomainObject SomeDomainObject){
    //在更新对象之前,spring安全性将检查安全规则
    }
    
  • 为此,应在applicationContext.xml中启用安全注释:

    
    

  • 啊,感谢您的快速回答,我不认为实现PermissionEvaluator会这么容易。查看
    AclPermissionEvaluator
    实现,他们使用某种
    ObjectIdentityRetrievalStrategy
    …您可以同时使用列表和代码高亮显示,只需添加四个额外的空格。我编辑了这篇文章作为示例,请参见来源。:)