Spring Security 中如何细化权限粒度?( 二 )

这个 Sid 大家可以简单理解为当前用户的权限(这个说法不是很准确,可以近似理解) 。
ObjectIdentity
ObjectIdentity 是一个域对象,这是官方的说法,有点拗口 。实际上这就是你要操作的对象 。
例如我有一个 User 对象,如果直接去记录能够对 User 对象执行哪些操作,这就会导致高耦和 。所以我们需要对其解耦,将所有需要操作的对象通过 ObjectIdentity 描述出来,这样就能确保权限系统不和具体的业务绑定 。
ObjectIdentity 中有两个关键方法,getType 和 getIdentifier 。一般来说,getType 方法返回真实对象类的全路径,例如 org.JAVAboy.acl.model.User,getIdentifier 方法则返回真实对象的 id,通过这两个方法,就能够锁定一个对象 。
Acl
看名字就知道,这算是整个系统的核心调度部分 。
一个 Acl 对象会关联一个 ObjectIdentity,一个 Acl 对象还拥有一个 Sid,这个 Sid 表示这个 Acl 是属于谁的?属于谁,谁就可以修改甚至删除这个 Acl 对象 。
AccessControlEntry
AccessControlEntry 简写为 ACE,一个 AccessControlEntry 对象代表一条权限记录 。每一个 AccessControlEntry 都对应了一个 Acl,一个 Acl 对象对应多个 AccessControlEntry,有了这层对应关系,相当于就知道这个权限操作的是哪个对象 。
然后 AccessControlEntry 中还包含一个 Sid 和一个 Permission 对象,表示某个 Sid 具备某种权限 。
可以看到,Acl+ACE,就描述出来了某个 Sid 可以具备某个 ObjectIdentity 的某种 Permission 。
Permission
这个就是具体的权限对象 。似乎是受 linux 影响,它使用了权限掩码,最多支持 232-1 种权限 。
Spring Security 种默认定义了五种:
public class BasePermission extends AbstractPermission { public static final Permission READ = new BasePermission(1 << 0, 'R'); // 1 public static final Permission WRITE = new BasePermission(1 << 1, 'W'); // 2 public static final Permission CREATE = new BasePermission(1 << 2, 'C'); // 4 public static final Permission DELETE = new BasePermission(1 << 3, 'D'); // 8 public static final Permission ADMINISTRATION = new BasePermission(1 << 4, 'A'); // 16 protected BasePermission(int mask) {  super(mask); } protected BasePermission(int mask, char code) {  super(mask, code); }}AclService
AclService 接口中主要定义了一些解析 Acl 对象的方法,通过 ObjectIdentity 对象解析出其对应的 Acl 。
AclService 主要有两类实现接口:

  • JdbcAclService
  • JdbcMutableAclService
前者主要是针对 Acl 的查询操作,后者支持 Acl 的添加、更新以及删除等操作 。我们常用的是 JdbcMutableAclService 。
至此,Acl 中一些核心概念就和小伙伴们介绍完了 。
2.2 Acl 数据表上面提到的对象数据,都需要对应的数据表来维护,在 spring-security-acl 依赖中,为这些数据表都提供了脚本 。
Spring Security 中如何细化权限粒度?

文章插图
 
可以看到,针对不同类型的数据库,都有对应的脚本 。
这里主要涉及到四张表,接下来松哥以 MySQL 脚本为例,来分别介绍每张表的作用及其字段的含义 。
acl_class
acl_class 是用来保存对象类型的全路径,如下:
Spring Security 中如何细化权限粒度?

文章插图
 
这里的 id 自增长,class 中保存的是相应对象的全路径名 。
acl_sid
acl_sid 表用来保存 Sid 的 。
Spring Security 中如何细化权限粒度?

文章插图
 
根据前面的介绍,存在两种类型的 Sid,GrantedAuthoritySid 和 PrincipalSid 。所以这里的 principal 字段表示该 Sid 是哪种类型的 。
acl_object_identity
acl_object_identity 用来保存需要进行访问控制的对象信息 。
Spring Security 中如何细化权限粒度?

文章插图