Spring Security ACL权限配置:为对象创建者赋予管理权限后,如何为其他指定用户添加读写权限
为指定用户添加Spring Security ACL的READ和WRITE权限
其实步骤和你给创建者赋予管理权限的逻辑类似,只是需要先获取已有的ACL实例,再针对目标用户添加对应的权限即可。下面是具体的实现步骤和代码示例:
1. 获取目标对象的已有ACL
首先你需要通过ObjectIdentity获取已经创建好的ACL(因为你已经给创建者加过权限,所以这个对象的ACL已经存在了),可以用aclService.readAclById()方法,如果对象不存在ACL的话会抛出NotFoundException,建议做个异常处理:
ObjectIdentity objectIdentity = new ObjectIdentityImpl(MyClass.class, myObject.getId()); MutableAcl acl; try { acl = (MutableAcl) aclService.readAclById(objectIdentity); } catch (NotFoundException e) { // 根据业务逻辑处理,比如抛出异常(不过你已经创建过ACL,大概率不会走到这里) throw new RuntimeException("目标对象的ACL不存在", e); }
2. 创建目标用户的Sid
针对你要授权的指定用户,创建对应的PrincipalSid,需要传入该用户的用户名(也就是用户登录时的principal值):
// 假设targetUsername是你要授权的用户的用户名 Sid targetUserSid = new PrincipalSid(targetUsername);
3. 插入READ和WRITE权限的ACE
接下来就可以往ACL中插入对应的权限条目(ACE)了,你可以选择分开插入READ和WRITE,也可以一次性处理。注意ACE的顺序会影响权限判断,Spring Security ACL会按顺序匹配权限,一般把更具体的权限放在前面,不过这里都是允许权限,顺序影响不大:
// 插入READ权限,用acl.getEntries().size()表示把权限加到条目末尾 acl.insertAce(acl.getEntries().size(), BasePermission.READ, targetUserSid, true); // 插入WRITE权限 acl.insertAce(acl.getEntries().size(), BasePermission.WRITE, targetUserSid, true);
4. 更新ACL到数据库
最后别忘了调用updateAcl()方法把修改后的ACL持久化到数据库:
aclService.updateAcl(acl);
一些注意事项
- 确保执行这段代码的用户拥有修改该对象ACL的权限:你之前给创建者赋予了
ADMINISTRATION权限,所以创建者执行这段操作是没问题的,如果是其他用户操作,需要先确认他们有对应的权限。 - 目标用户必须是系统中已存在的用户:
PrincipalSid对应的用户名要在你的用户体系中存在,否则权限判断时会无法匹配。 - 如果你想批量给多个用户加权限,可以循环创建
Sid然后逐个插入ACE即可。
内容的提问来源于stack exchange,提问作者geschema
相关产品推荐
相关产品推荐

