java使用casbin
casbin
casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。,而业界常常使用的RBAC(基于角色的权限访问控制),也是很完美的支持.整个项目都是基于PML 的论文,还是很厉害的.
集成和基本应用
通过maven集成
引入对应jar包,如果用数据库存储policy,可以考虑引用adapter的包,也可以自己去实现对应查询sql和数据库表结构
<dependency>
<groupId>org.casbin</groupId>
<artifactId>jcasbin</artifactId>
<version>1.28.0</version>
</dependency>
<dependency>
<groupId>org.casbin</groupId>
<artifactId>jdbc-adapter</artifactId>
<version>2.3.2</version>
</dependency>
自定义实现存储policy
org.casbin.jcasbin.main.CoreEnforcer#loadPolicy
enforce加载policy就是通过该方法,所以理论上自定义class实现Adapter接口就行,这样可以少引入一个adapter包,而且可自定义字段和表名.
代码实现
首先RBAC结构性下,用户和角色关系,角色和资源位关系都是多对多,在casbin中,我们存储的就是对角色对应的资源位的关系.用户,角色,资源等位置需要自己去单独存储.主要依赖2种主要api,看使用情况
初始化Enfoce
Enforcer e = new Enforcer("examples/rbac_model.conf", "examples/rbac_policy.csv");
生成全局使用的enfoce对象, 后续所有操作都是对该对象上的接口的调用
用户关联角色和域
- 需要提前将用户,角色等相关信息查询出来
- 调用下面方法对用户和角色进行绑定
boolean added = e.addRoleForUser("alice", "data2_admin");
角色关联资源
- 实现adapter之后,将角色和资源关联关系存储到了数据库中
- 新增策略就是直接调用对应的保存接口
e.addPolicy(new Policy("fulln", "/test", "GET"));
e.savePolicy();
角色关联访问动作
这一步可以不用写,如果有特定的资源访问可以后续在写入,
e.AddPermissionForUser("bob", "read")
权限检查
在访问到对应资源之前先走一遍查询, 如果成功就可以直接访问, 如果失败, 则进行自定义的信息返回.
String sub = "alice"; // 想要访问资源的用户/角色
String obj = "data1"; // 将要被访问的资源
String act = "read"; // 用户对资源进行的操作
if (e.enforce(sub, obj, act) == true) {
// 允许alice读取data1
} else {
// 拒绝请求,抛出异常
}
总结
Casbin 可以:
- 支持自定义请求的格式,默认的请求格式为{subject, object, action}。
具有访问控制模型model和策略policy两个核心概念。 - 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
- 支持内置的超级用户 例如:root或administrator。超级用户可以执行任何操作而无需显式的权限声明。
- 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*
Casbin 不能:
- 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
- 管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系。
casbin 和我们常用的管理最大的不同就是,它只针对权限的控制.用户,角色等的都需要自行去存储,不过这样也为了后续扩展提供了很大的便利.