一.基础概念

Casbin是一个强大的,高效的开源访问控制框架,权限管理机制支持多种访问控制模型

在项目中通过Oauth2,OpenID进行身份认证,即验证用户的用户名和密码。再做访问控制,权限约束时,引入casbin来实现,其思想是存储RBAC方案中的用户和角色之间的映射关系,同时还适用于ABAC的规则,便于以后的扩展。

 

RBAC(Role-Based Access Control)

提炼出角色的概念,从而实现灵活的权限管理。表结构大致是用户关联角色,角色关联权限的设计

其中RBAC又分为RBAC0,RBAC1(角色继承),RBAC2(角色约束),RBAC3(RBAC1+RBAC2)

 

ABAC(Attribute-Based Access Control)

不同于将用户和权限做关联,ABAC是通过动态计算一个或一组属性来满足某种条件进行授权判断。大致分为四种属性:用户属性,环境属性,操作属性,对象属性(资源属性),搭配组合更加灵活

 

二.工作原理

Casbin的工作原理:基于PERM模式,通过策略规则和资源进行匹配。原理大致如下:

微服务架构项目怎么获取用户权限 微服务权限设计_sed

 

 

 

三.实践

(1)新建控制台程序CasbinNet

引入Nuget包:Casbin.NET ,Casbin.NET.Adapter.EFCore

微服务架构项目怎么获取用户权限 微服务权限设计_访问控制_02

(2)添加rbac_model.conf规则

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act, eft # 这里我们定义了eft,不使用默认值

# Policy effect
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny)) # 这里使用了deny优先

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act #最简单的匹配规则。请求的参数与策略参数一致时获得策略结果

(3)核心代码:

1  var options = new DbContextOptionsBuilder<CasbinDbContext<int>>()
 2                 .UseSqlite("Data Source=casbin_example.sqlite3")
 3                 //.UseNpgsql("User ID=postgres;Password=123456;Host=127.0.0.1;Port=5432;Database=Craftica;Pooling=true;")
 4                 .Options;
 5             var context = new CasbinDbContext<int>(options);
 6 
 7             // If it doesn't exist, you can use this to create it automatically.
 8             //context.Database.EnsureCreated();
 9 
10             // Initialize a EF Core adapter and use it in a Casbin enforcer:
11             var efCoreAdapter = new EFCoreAdapter<int>(context);
12             var e = new Enforcer("examples/rbac_model.conf", efCoreAdapter);
13 
14             // Load the policy from DB.
15             e.LoadPolicy();
16 
17             // Check the permission.
18             bool aaa= e.Enforce("alice", "data1", "read");

示例中使用UseSqlite, 初次运行会在数据库中自动生成表casbin_rule。

微服务架构项目怎么获取用户权限 微服务权限设计_sed_03

 

 

字段V0-V5名称可以暂时不用管,第四步会具体进行修改

在Sqlite中配置角色资源信息,如下图所示:

微服务架构项目怎么获取用户权限 微服务权限设计_加载_04

其中Enforcer通过rbac_model.conf和资源文件列表匹配数据,再和request模型进行匹配,如果返回true,表示成功,反之则没有权限

 

以alice,data1,read为例:

微服务架构项目怎么获取用户权限 微服务权限设计_sed_05

 

四.Adapter 适配器优化

不用casbin提供的Nuget包 Casbin.NET.Adapter.EFCore

如下图所示:

微服务架构项目怎么获取用户权限 微服务权限设计_访问控制_06

自定义Adapter和表实体Model模型,其中CasbinDbAdapter要继承接口IAdapter的一些策略的增删改查的方法

微服务架构项目怎么获取用户权限 微服务权限设计_加载_07

核心是实现加载策略的方法LoadPolicy,要有数据列表加载:

微服务架构项目怎么获取用户权限 微服务权限设计_加载_08

在实际开发中,为了加载数据的提升,建议放在Redis中维护

微服务架构项目怎么获取用户权限 微服务权限设计_加载_09

其他使用规则和步骤三大致相似,附中提供参考源码

 

以上仅用于学习和总结!

 

附:

步骤3源码:

链接:https://pan.baidu.com/s/1ivvDfolFzImwERSzfY4QgQ

提取码:s3v4

 

步骤4源码:

链接:https://pan.baidu.com/s/1e25OYt5R6BMsh3TW8UjCDg

提取码:xq3m

 

参考文档:

https://casbin.org/docs/zh-CN/get-started

https://www.jianshu.com/p/ce0944b4a903