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对象, 后续所有操作都是对该对象上的接口的调用

用户关联角色和域

  1. 需要提前将用户,角色等相关信息查询出来
  2. 调用下面方法对用户和角色进行绑定
boolean added = e.addRoleForUser("alice", "data2_admin");

角色关联资源

  1. 实现adapter之后,将角色和资源关联关系存储到了数据库中
  2. 新增策略就是直接调用对应的保存接口
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 可以:

  1. 支持自定义请求的格式,默认的请求格式为{subject, object, action}。
    具有访问控制模型model和策略policy两个核心概念。
  2. 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  3. 支持内置的超级用户 例如:root或administrator。超级用户可以执行任何操作而无需显式的权限声明。
  4. 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

Casbin 不能:

  1. 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
  2. 管理用户列表或角色列表。 Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin 的设计思想并不是把它作为一个存储密码的容器。 而是存储RBAC方案中用户和角色之间的映射关系。

casbin 和我们常用的管理最大的不同就是,它只针对权限的控制.用户,角色等的都需要自行去存储,不过这样也为了后续扩展提供了很大的便利.

posted @ 2022-10-13 11:42  _我在清水河边  阅读(353)  评论(0编辑  收藏  举报