基于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自我保护机制是什么?
当Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁启动关闭客户端)节点会进入自我保护模式,保护注册信息,不再删除注册数据,故障恢复时,自动退出自我保护模式.
- Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的.
- MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?
以下是 MySQL_fetch_array 和 MySQL_fetch_object 的区别: MySQL_fetch_array() – 将结果行作为关联数组或来自数据库的常规数组返回. MySQL ...
- 字节码增强-learnning
jvm加载java的过程主要是: 编写java文件->进行java文件的编译->生成.class字节码文件->jvm通过类加载器去加载生成的二进制文件 java编译器将源码文件编译称 ...
- elasticsearch 了解多少,说说你们公司 es 的集群架构,索 引数据大小,分片有多少,以及一些调优手段 。
面试官:想了解应聘者之前公司接触的 ES 使用场景.规模,有没有做过比较大 规模的索引设计.规划.调优. 解答: 如实结合自己的实践场景回答即可. 比如:ES 集群架构 13 个节点,索引根据通道不同 ...
- 详解BI系统中的任务调度
任务调度是一个通用的计算机概念,可以简单地理解为计算机基于一定时间频率,自动执行一项进程任务.任务调度是操作系统的重要组成部分,Windows系统中的定时任务和Linux的Crontab都是常用的系统 ...
- ubuntu+ROS安装turtulebot3
0 简介 Turtlebot是一种室内移动机器人,搭载激光传感器,使机器有精确的距离感知能力.通过搭建仿真环境,可以在没有硬件支持的情况下进行仿真和编程,并熟悉ros系统.环境使Ubuntu16.04 ...
- 联想电脑“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态” 解决方法
当在虚拟机上安装Ubuntu系统时,出现 "此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态" 弹窗此时需要进入BIOS修改相关的设置,此处以联想ideap ...
- (stm32f103学习总结)—RTC独立定时器—实时时钟实验
一.STM32F1 RTC介绍 1.1 RTC简介 STM32 的实时时钟( RTC)是一个独立的定时器. STM32 的 RTC 模 块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的 ...
- C++ | 栈的应用(逆波兰算法) | 计算器
#include <iostream> using std::cin; using std::cout; using std::endl; template<typename T&g ...