基于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)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...
随机推荐
- springMVC和struts2的区别有哪些?
(1)springmvc的入口是一个servlet即前端控制器(DispatchServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilte ...
- 面试问题之C++语言:面向对象的五个原则
五大原则: 1.单一职责原则SRP(Single Responsibility Principle):是指一个类的功能要单一,不能包罗万象.如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌 ...
- java程序如何确保多线程的运行安全?
线程的安全问题体现在: 原子性:一个或多个操作在CPU执行过程中不被中断的特性 可见性:一个线程对共享变量的修改,另一个线程能立刻看到 有序性:程序执行的顺序按照代码的先后顺序执行 导致线程存在安全问 ...
- vue中基于sortablejs与el-upload实现文件上传后拖拽排序
今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...
- 微信小程序中涉及虚拟产品购买,ios暂不支持的相关整理意见
这个东西呢也不能怪微信小程序,属实苹果搞的事情,那怎么小程序相关内容去通过审核呢? 首先我们要搞清楚哪些属于虚拟商品:如某某书币,某某会员,或者是提前编辑好的网课,文档等都属虚拟商品购买,简言之就是没 ...
- 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
-webkit-box 的用法 通常,在移动端要实现水平方向平分宽度的布局,会使用 -webkit-box 来布局.它的使用方法是: <div class='parent'> <di ...
- 介绍一项让 React 可以与 Vue 抗衡的技术
好吧,我承认我是标题党.React 明明如日中天,把它与 Vue 倒过来,给 Vue 加点东西或可与 React 抗衡.不过,这两年 Vue 干的正是这事,不断加东西,不断优化,按它现有发展速度超越 ...
- webpack的安装 以及 问题 以及 作用
参考链接: https://blog.csdn.net/Rnger/article/details/81086938 https://blog.csdn.net/qq_38111015/art ...
- Taro开发微信小程序遇到的问题和解决方法
1.scroll-view 置顶, 给设置scroll-top为0无效问题? 解决方案: 不触发置顶问题,需要给scroll-top一个设置接近0的随机数,Math.random() 2.scroll ...
- 前端实现导出excel
结果: 将网页上拿到的数据导出成excel文件 实现: HTML代码 <div> <button type="button" onclick="expo ...