这个 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 中一些核心概念就和小伙伴们介绍完了 。
2.2 Acl 数据表上面提到的对象数据,都需要对应的数据表来维护,在 spring-security-acl 依赖中,为这些数据表都提供了脚本 。
文章插图
可以看到,针对不同类型的数据库,都有对应的脚本 。
这里主要涉及到四张表,接下来松哥以 MySQL 脚本为例,来分别介绍每张表的作用及其字段的含义 。
acl_class
acl_class 是用来保存对象类型的全路径,如下:
文章插图
这里的 id 自增长,class 中保存的是相应对象的全路径名 。
acl_sid
acl_sid 表用来保存 Sid 的 。
文章插图
根据前面的介绍,存在两种类型的 Sid,GrantedAuthoritySid 和 PrincipalSid 。所以这里的 principal 字段表示该 Sid 是哪种类型的 。
acl_object_identity
acl_object_identity 用来保存需要进行访问控制的对象信息 。
文章插图
- object_id_class:关联 acl_class.id 。
- object_id_identity:需要控制的对象的 id 。
- parent_object:父对象 ID,关联一条 acl_object_identity 记录 。
- owner_sid:这个 acl 记录拥有者的 sid 。
- entries_inheriting:是否需要继承父对象的权限 。
推荐阅读
- 菊花和甘草的功效,香苏茶具有解毒祛暑理气化淤温胃和中的功效
- springcloud微服务架构开发实战:分布式消息总线
- 中南大学什么专业最牛?
- 十分钟让您看懂C语言中void用法
- 在诗中,苏轼把西湖比作西子,说西湖像她一样 苏东坡欲把西湖比西子浓妆淡抹总相宜
- 喝中药期间能喝红茶吗,经期能喝凉茶吗
- 梁启超是中国近代什么派领袖学者 梁启超是中国近代最早系统介绍和倡导什么理论的人物
- 明宣宗朱瞻基在位多少年? 明朝弘治中兴
- 蒲松龄考科举多年,但并未考中秀才 蒲松龄考了几次科举
- 了翁茶业招商加盟信息,正皓茶业全国招商火热进行中