基于casbin的ABAC/RBAC权限实践

7b32efc19ab7edb9c1d52547e84a3825.png


五一假期疫情封在家也没事做,就想来优化一下一个前端容器小项目

之前的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的话 就切换一个adaptere.SetAdapter(new DefaultFileAdapter(csv));e.LoadPolicy();return e;
}

由于本身我的这个项目是一个中间件,

734f68875e3c1242dde92b25736539f2.png

//内部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);
61c63e4e3ac46c019a35f20603a9fdb4.png

设计一个页面来配置策略

18339f9065e54f92558bdd42e3f96371.png

这也是针对casbin的一个ui操作的封装

  • 支持创建用户

  • casbin的策略进行增删改查

  • 支持的api资源的列表展示

那么通过这个ui操作就很容易去配置

粗粒度:某个用户对哪些project有权限
9b4d3bb1ae9e2ba4842ed74dd15d4368.png
image

如上图,资源路径我配置了/* 代表这个zdyu用户可以访问project:test的所有操作

细力度:某个用户对哪些project的哪些具体操作有权限
41c26e9dd96b1895bb5856220ca2850b.png
image

如上图,代表zdyu这个用户只能访问test这个project下的 部署和回滚2个功能

总结

本身研究怎么用casbin是非常简单的,这里主要分享了结合具体项目来如何设计,细节源码可以查看

https://github.com/yuzd/Spa

spa单页面容器里面一个project相当于一个二级域名的应用,应用内互相隔离,可以代替部署nginx或apache,对前端开发者友好,适合在某些只是用来静态项目访问的场景,来提高效率!

权限这块使用casbin很轻量级,目前只保存在本地文件中,将来如果换成db也只是换一个adapter不用改逻辑非常方便。

531e1e4040aa9720a6982a48beacc961.png


我是正东,学的越多不知道也越多。一起追求高效率编程~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python3 实现建造者模式

建造者模式 建造者模式用于创建复杂的对象。使用建造者模式可以使复杂的过程层次明了、清晰&#xff0c;把对象的创建以及使用进行了解耦。实际上从代码的角度上看&#xff0c;是进行了多次封装&#xff0c;使代码结构更为规范合理&#xff0c;层次结构更加鲜明。 在一个复杂…

系列网络服务器机柜,什么是网络机柜 网络机柜和服务器机柜有哪些区别【详解】...

【网络机柜】什么是网络机柜 网络机柜和服务器机柜区别服务器机柜和网络机柜的区别服务器机柜 &#xff1a;用来组合安装面板、插件、插箱、电子元件、器件和机械零件与部件&#xff0c;使其构成一个整体的安装箱。可以配置&#xff1a;专用固定托盘、专用滑动托盘、电源插排、…

【3D Max】3D max如何删除环境贴图

问题描述&#xff1a;在用3dm max贴图的时候&#xff0c;如果不选中对象&#xff0c;很容易将图贴到背景环境中去&#xff0c;情况如下所示&#xff1a; 解决办法有二&#xff1a; 一、不参与渲染 快捷键8&#xff0c;在“环境和效果”窗口中去掉“使用贴图”前面的√。 二、…

C#语法糖系列 —— 第四篇:聊聊 Span 的底层玩法

把 Span 归于语法糖&#xff0c;可能有些偏了&#xff0c;但偏了就偏了&#xff0c;哈哈&#xff0c;只要是分享就好&#xff0c;C# 发展至今&#xff0c;已经是一门非常重的语言了&#xff0c;所有想要的它都要&#xff0c;即可以&#xff1a;面向过程编程面向对象编程面向函数…

【ArcGIS风暴】河流水系左斜体样式经典设置方法

目录 一、效果预览 二、实现方法 一、效果预览 河流水系在作图时一般设置为左斜体、蓝色,如黄河、青海湖、洮河等,如下图所示: 二、实现方法 下面介绍在ArcGIS 10.5中的实现方法。 1、ArcGIS设置方法 绘图工具添加文字或者将标注转为注记,双击,打开属性,点击更改符号…

HBase简介(很好的梳理资料)

HBase HBaseHadoop网络应用数据结构NoSQL 一、 简介 history started by chad walters and jim 2006.11 G release paper on BigTable 2007.2 inital HBase prototype created as Hadoop contrib 2007.10 First useable Hbase 2008.1 Hadoop become Apache top-level project …

python 实现原型设计模式

原型设计模式主要在当新建一个对象的时候&#xff0c;觉得很麻烦&#xff0c;并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。 例如你写一个东西更新&#xff0c;不同的版本&#xff0c;这个时候以前的版本肯定要保留&#xff0c;并且从此基础上…

装服务器显示磁盘脱机,服务器磁盘处于脱机

服务器磁盘处于脱机 内容精选换一换配置目的端或启动目的端时提示“SMS.1311 目的端磁盘个数不够”。在配置目的端服务器过程中&#xff0c;会校验目的端磁盘数量是否和源端一致。当出现该错误时&#xff0c;检查目的端服务器磁盘数量是否少于源端服务器磁盘数量&#xff0c;或…

剑指offer之重建二叉树

1 问题 重建二叉树&#xff1a;给定二叉树的先序遍历&#xff08;根左右&#xff09;和中序&#xff08;左中右&#xff09;遍历结果&#xff0c;建立这棵二叉树。输入保证二叉树无重复结点 以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例 2 分析 先序遍…

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

当我会AOP之后,去丈母娘家都是挺着胸脯!

当和朋友谈到AOP时&#xff0c;第一映像会说AOP的应用层面&#xff0c;比如拦截器、过滤器&#xff0c;实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的&#xff0c;AOP是思想&#xff0c;面向切面思想。既然是编程思想&#xff0c;那我们就有必要了…

python 最简单的实现适配器设计模式

适配器设计模式是懒得改动某些代码&#xff0c;或者某些接口不方便改动的时候&#xff0c;使用一个特定的封装&#xff0c;一些特定的编写办法&#xff0c;使不同的接口可以使用同种调用方式使用。 更简单的说话则是&#xff0c;例如几个不同的接口 aliyun、qiniuyun、tencent…

Envi和ArcGIS软件打开和处理.NC4数据

NC4是NetCDF-4的简缩形式。 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目…

C#多线程调试

概要这篇文章主要分享多线程部分调试技巧&#xff0c;在日常的开发工作中会经常遇到多线程调试的需要。在我们调试的过程中会出现断点的焦点在多个线程之间“反复横跳”根本无法集中跟踪某一个线程的操作链路。那么今天我们来看看如何调试操作。如果有其它需要的可以参考下面微…

最速下降法(梯度下降法)

最速下降法的影子在机器学习中正是无处不在&#xff0c;它简单实用。 一、表示 在最速下降法中&#xff0c;对权值向量w的连续调整是在最速下降的方向上&#xff0c;即它是与梯度向量方向相反的&#xff0c;梯度向量记为&#xff08;1&#xff09;&#xff0c;简记&#xff08;…

游戏服务器销售额,游戏服务器销售一个月

游戏服务器销售一个月 内容精选换一换应用容器化改造有三种方式&#xff0c;您可单击这里查看。本教程以某游戏为例&#xff0c;将该游戏进行微服务的架构改造&#xff0c;再进行容器化。本教程不对改造细节做深度讲解&#xff0c;仅讲解大致的建议。如需要详细了解容器化改造的…

使用AppCompat项目模版

2019独角兽企业重金招聘Python工程师标准>>> 使用AppCompat项目模版 从Android API 22开始&#xff0c;谷歌推荐使用AppCompatActivity来构建带标题栏的App&#xff0c;而不是原有的ActionBarActivity。如果用户想要使用AppCompatActivity&#xff0c;可以使用Xamar…

python3 最基本且简单的实现组合设计模式

组合模式是把一个类别归为一个整体&#xff0c;并且组织多个整体之间的关系&#xff0c;使用通过树形结构来描述所有整体。 一般的编写方式为一个类别对象下添加多个该对象的元素&#xff0c;该对象又为其它对象下的元素。简单来说就是一个学校有一个总部&#xff0c;总部下有…

SQL Server 2008 阻止保存要求重新创建表的更改问题

习惯了使用SQL Server 2005进行数据库系统开发,为了赶上潮流的发展,最近在使用SQL 2008数据库,本来建好了一个表,后面需要对表的设计做些修改(比如字段长度的修改,忘记了设置主键等等),结果弹出错误提示,说什么“组织保存要求重新创建表的更改”,如下所示: 解决办法…

$geoNear

怎么使用mongoose的geoNear 2014-11-26 15:05:20| 分类&#xff1a; mongodb | 标签&#xff1a;mongoose |举报|字号 订阅 下载LOFTER我的照片书 |起因 在开发的时候碰到一个情况&#xff0c;数据源有100个景点&#xff0c;需要对给出的一个点&#xff0c;求距离它最近的…