基于casbin的RBAC权限实践
五一假期疫情封在家也没事做,就想来优化一下一个前端容器小项目
之前的TODOlist里面有一项是权限这块时隔2年了还一直没有动手
迟迟没搞主要还是我太懒了,哈哈 其实我一直想要找一个轻量级的权限通用方案
权限的数据源可以切换,但是逻辑基本不用动 权限策略定义简单不复杂,支持RBAC,ABAC(粒度可粗可细) 支持内置超级用户(上帝模式)
知道我最近研究了一下casbin(基于各种访问控制模型的授权), 发现它正好满足了我以上几个点 官网: https://casbin.org/
基于cashbin的权限实践
1. 权限设计
分为2种权限:超级管理员(上帝模式) 和 普通用户
我这个程序的功能是按照项目维度来区分的,超级管理员创建一个空项目后,授权给别人去维护,总共包含7大功能:
超级管理员可以访问所有功能, 但只能是【超级管理员】做的有1和2和3
1.权限配置(普通用户创建和删除,权限的修改和保存) 2.全局配置 3.创建空项目 4.上传并部署该项目 5.把项目回滚到上一个版本 6.项目维度的服务端js脚本(读和写) 7.项目维度的配置文件(读和写)
普通用户则可以被超级管理员在权限配置页面创建并进行配置来限制是否授予访问4~7这几个功能
2. 代码开发
casbin基本主流的开发语言都有对应的实现,这里我用netcore版本(Casbin.NET)
首先定义模型:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"
由于我这个是按照project进行权限控制的,所以我选用的是这个模型
sub -> user(登录用户名,root是超级用户/上帝模式) obj -> project(项目) act -> api资源(这里用了基于正则的方式为了应对配置一个用户可以访问project下所有权限)
/// <summary>
/// 创建casbin模型
/// </summary>
/// <returns></returns>
public static Enforcer createEnforcer()
{
var e = new Enforcer();
var m = NetCasbin.Model.Model.CreateDefault();
m.AddDef("r", "r", "sub, obj, act");
m.AddDef("p", "p", "sub, obj, act");
m.AddDef("e", "e", "some(where (p.eft == allow))");
m.AddDef("m", "m", "r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"");
var csv = Path.Combine(WebRootPath, CasBinPolicyFile);
if (!File.Exists(csv))
{
File.CreateText(csv);
}
e.SetModel(m);
// 目前我的权限配置文件是放在csv文件中 切换成存db的话 就切换一个adapter
e.SetAdapter(new DefaultFileAdapter(csv));
e.LoadPolicy();
return e;
}
由于本身我的这个项目是一个中间件,
//内部api
app.UseWhen(
c =>
{
// 检查路由是否满足要求
if (!ApiMiddleware.CanInvoke(c, out var route))
{
return false;
}
// 路由规则满足后检查api是否存在
return c.RequestServices.GetService<SpaDomain>()?.IsSpaApi(route.Item2) ?? false;
},
_ => _.UseMiddleware<ApiMiddleware>());
对于普通用户可访问的内部的api访问路径进行规则约束
4.上传并部署该项目-> /{project}.reupload 5.把项目回滚到上一个版本 -> /{project}.rollback 6.项目维度的服务端js脚本(读) -> /{project}.getconfigjson 项目维度的服务端js脚本(写) -> /{project}.saveconfigjson 7.项目维度的配置文件(读) -> /{project}.serverjsget 项目维度的配置文件(写)-> /{project}.serverjssave
这样我在ApiMiddleware里面可以进行统一权限拦截处理了
解析请求路径 拿到 project(obj) 和 act (api) 拿到当前登录 拿到 sub(user) 拿到了sub,obj,act三要素后调用casbin方法进行验证
bool isAuthed = ef.Enforce(sub, obj, act);
设计一个页面来去配置策略
这也是针对casbin的一个ui操作的封装
支持创建用户 casbin的策略进行增删改查 支持的api资源的列表展示
那么通过这个ui操作就很容易去配置
粗粒度:某个用户对哪些project有权限
如上图,资源路径我配置了/* 代表这个zdyu用户可以访问project:test的所有操作
细力度:某个用户对哪些project的哪些具体操作有权限
如上图,代表zdyu这个用户只荀彧访问test这个project下的 部署和回滚2个功能
总结
本身研究怎么用casbin是非常简单的,这里主要分享了结合具体项目来如何设计,细节源码可以查看
spa单页面容器里面一个project相当于一个二级域名的应用,应用内互相隔离,可以代替部署nginx或apache,对前端开发者友好,适合在某些只是用来静态项目访问的场景,来提高效率!

基于casbin的RBAC权限实践的更多相关文章
- vue基于d2-admin的RBAC权限管理解决方案
前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...
- 基于角色访问控制RBAC权限模型的动态资源访问权限管理实现
RBAC权限模型(Role-Based Access Control) 前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管 ...
- 十二、基于Django实现RBAC权限管理
一.RBAC概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色. 从企业的角度来说,基本上是按照角色来划分职能.比如,CEO ...
- 基于中间件的RBAC权限控制
RBAC 是什么 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联. 在 Django 中,权限就是用户对一个包含正则表达式 url ...
- 基于SpringSecurity实现RBAC权限控制(待完善)
Spring Security是一个为企业应用系统提供声明式的安全访问控制功能,减少为了企业应用系统安全控制而编写的大量重复代码. 认证: spring security的原理就是使用很多的拦截器对U ...
- 基于thinkphp的RBAC权限控制
RBAC Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3 ...
- 基于SSM的RBAC权限系统(1)-利用ajax,bootstrap,ztree完成权限树功能
仅支持回显以及选择,不支持在树中的编辑 搭建后台回显以及修改的模块 JSON数据封装 public class Msg { private int code; private String msg; ...
- [开源]Gin + GORM + Casbin+vue-element-admin 实现权限管理系统(golang)
简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...
- ThinkPHP中RBAC权限管理的简单应用
RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...
随机推荐
- Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?
1.ZooKeeper保证的是CP,Eureka保证的是AP ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka各个节点是平等关系,只要有一台Eureka ...
- Java并发机制(6)--阻塞队列
Java并发编程:阻塞队列整理自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3933404.html 1.什么是阻塞队列 除了同步容器(Hashtable ...
- 为什么要使用 kafka,为什么要使用消息队列?
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理. 解耦 ...
- JWT jti和kid属性的说明
jti chaim=== JWT ID " jti"(JWT ID)声明为JWT提供了唯一的标识符. 标识符值的分配方式必须确保将相同值偶然分配给不同数据对象的可能性可以忽略不计: ...
- Java 中如何将字符串转换为整数?
String s="123"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue();
- redis有哪些功能
基于本机内存的缓存 为了解决调用API依然需要2秒的问题,经过排查,其主要原因在于使用SQL获取热点新闻的过程中消耗了将近2秒的时间,于是乎,我们又想到了一个简单粗暴的解决方案,即把SQL查询的结果直 ...
- JPA、JTA、XA相关索引
JPA和分布式事务简介:https://www.cnblogs.com/onlywujun/p/4784233.html JPA.JTA与JMS区别:https://www.cnblogs.com/y ...
- 简述 Memcached 内存管理机制原理?
早期的 Memcached 内存管理方式是通过 malloc 的分配的内存,使用完后通过 free 来回收内存,这种方式容易产生内存碎片,并降低操作系统对内存的管理效 率.加重操作系统内存管理器的负担 ...
- 有哪些类型的通知Advice?
Before - 这些类型的 Advice 在 joinpoint 方法之前执行,并使用 @Before 注解标记进行配置. After Returning - 这些类型的 Advice 在连接点方法 ...
- java Web开发实现手机拍照上传到服务器
第一步: 搭环境,基本jdk 1.6+apache tomcat6.0+myeclipse2014 1.我们要清楚自己的jdk版本.因为我们Apache Tomcat配置的成功的前提是版本相对应. 安 ...