基于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)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...
随机推荐
- 谈一谈 Kafka 的再均衡?
在Kafka中,当有新消费者加入或者订阅的topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消费者)机制,Rebalance顾名思义 ...
- 当一个线程进入某个对象的一个 synchronized 的实例方 法后,其它线程是否可进入此对象的其它方法?
如果其他方法没有 synchronized 的话,其他线程是可以进入的. 所以要开放一个线程安全的对象时,得保证每个方法都是线程安全的.
- SpringBoot 自定义配置文件不会自动提示问题
参阅:https://www.jianshu.com/p/ec3f0b0371e6
- Zookeeper 的典型应用场景 ?
Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员 可以使用它来进行分布式数据的发布和订阅. 通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watch ...
- 利用Properties类关联相关配置文件
文件目录 代码: package Lianxi;import java.io.FileInputStream;import java.io.FileNotFoundException;import j ...
- SCTF 2018_Simple PHP Web
SCTF 2018_Simple PHP Web 进入环境注意观察url http://www.bmzclub.cn:23627/?f=login.php 有点像是文件读取我们尝试读一下/etc/pa ...
- HTML中meta标签详解;property=og标签详解
meta是用来在HTML文档中模拟HTTP协议的响应头报文.META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之 ...
- 微信小程序要求HTTPS,如何选择SSL证书?
为了保护小程序应用安全,微信官方的需求文档要求,每个微信小程序必须事先设置一个通讯域名,并通过HTTPS请求进行网络通信,不满足条件的域名和协议无法请求.因此开发者应先准备好配置好HTTPS证书的域名 ...
- nodejs 实现 磁力链接资源搜索 BT磁力链接爬虫
项目简介 前端站点 项目效果预览 http://findcl.com 使用 nodejs 实现磁力链接爬虫 磁力链接解析成 torrent种子信息,保存到数据库,利用 Elasticsearch 实现 ...
- Java/C++实现模板方法模式---数据库操作
对数据库的操作一般包括连接.打开.使用.关闭等步骤,在数据库操作模板类中我们定义了connDB().openDB().useDB().closeDB()四个方法分别对应这四个步骤.对于不同类型的数据库 ...