微服务-角色权限设计(Casbin)(3-2)

一.基础概念
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模式,通过策略规则和资源进行匹配。原理大致如下:

 

 

 
三.实践
(1)新建控制台程序CasbinNet
引入Nuget包:Casbin.NET ,Casbin.NET.Adapter.EFCore
(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。

 

 

字段V0-V5名称可以暂时不用管,第四步会具体进行修改
在Sqlite中配置角色资源信息,如下图所示:
其中Enforcer通过rbac_model.conf和资源文件列表匹配数据,再和request模型进行匹配,如果返回true,表示成功,反之则没有权限
 
以alice,data1,read为例:
 
四.Adapter 适配器优化
不用casbin提供的Nuget包 Casbin.NET.Adapter.EFCore
如下图所示:
自定义Adapter和表实体Model模型,其中CasbinDbAdapter要继承接口IAdapter的一些策略的增删改查的方法
核心是实现加载策略的方法LoadPolicy,要有数据列表加载:
在实际开发中,为了加载数据的提升,建议放在Redis中维护
其他使用规则和步骤三大致相似,附中提供参考源码
 
以上仅用于学习和总结!
 
附:
步骤3源码:
链接:https://pan.baidu.com/s/1ivvDfolFzImwERSzfY4QgQ
提取码:s3v4
 
步骤4源码:
链接:https://pan.baidu.com/s/1e25OYt5R6BMsh3TW8UjCDg
提取码:xq3m
 
参考文档:
 

posted @ 2021-04-19 23:06  y_w_k  阅读(2010)  评论(0编辑  收藏  举报