一.基础概念
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
参考文档: