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

之前的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是非常简单的,这里主要分享了结合具体项目来如何设计,细节源码可以查看

https://github.com/yuzd/Spa

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

基于casbin的RBAC权限实践的更多相关文章

  1. vue基于d2-admin的RBAC权限管理解决方案

    前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...

  2. 基于角色访问控制RBAC权限模型的动态资源访问权限管理实现

    RBAC权限模型(Role-Based Access Control) 前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管 ...

  3. 十二、基于Django实现RBAC权限管理

    一.RBAC概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色. 从企业的角度来说,基本上是按照角色来划分职能.比如,CEO ...

  4. 基于中间件的RBAC权限控制

    RBAC 是什么 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联. 在 Django 中,权限就是用户对一个包含正则表达式 url ...

  5. 基于SpringSecurity实现RBAC权限控制(待完善)

    Spring Security是一个为企业应用系统提供声明式的安全访问控制功能,减少为了企业应用系统安全控制而编写的大量重复代码. 认证: spring security的原理就是使用很多的拦截器对U ...

  6. 基于thinkphp的RBAC权限控制

    RBAC  Role-Based Access Control 权限控制在后台管理中是十分常见的,它的模型大体上是下面这张图的形式 我用的字段和上面不一样,图只是个示例 一个简易的权限控制模型只需要3 ...

  7. 基于SSM的RBAC权限系统(1)-利用ajax,bootstrap,ztree完成权限树功能

    仅支持回显以及选择,不支持在树中的编辑 搭建后台回显以及修改的模块 JSON数据封装 public class Msg { private int code; private String msg; ...

  8. [开源]Gin + GORM + Casbin+vue-element-admin 实现权限管理系统(golang)

    简析 基于 Gin + GORM + Casbin + vue-element-admin 实现的权限管理系统. 基于Casbin 实现RBAC权限管理. 前端实现: vue-element-admi ...

  9. ThinkPHP中RBAC权限管理的简单应用

    RBAC英文全称(Role-Based Access Controller)即基于角色的权限访问控制,简单来讲,一个用户可以拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授 ...

随机推荐

  1. 如何在网上找MySQL数据库的JDBC驱动jar包?

    当我们在开发程序,涉及数据库时,总是需要用到相应的jar包,这不小编就给大家介绍一下如何下载相应的jar包 方法/步骤   1 在百度搜索栏上搜索MySQL 2 选择Downloads 3 选择 Co ...

  2. jvm-learning-双亲委派机制

    是什么 工作原理  例子 优势 什么是沙箱安全机制 其他知识 对类加载器的引用 类的主动使用和被动使用

  3. ACM - 图论 - P3385 负环

    P3385 负环 题目描述 给定一个 \(n\) 个点的有向图,请求出图中是否存在从顶点 \(1\) 出发能到达的负环. 负环的定义是:一条边权之和为负数的回路. 输入格式 本题单测试点有多组测试数据 ...

  4. 关于个人开源项目(vue app)的一些总结

    关于个人开源项目(vue app)的一些总结 项目地址 https://github.com/BYChoo/record 项目简介 此项目名叫:Record.是以Vue全家桶(vue,vue-rout ...

  5. java中匿名内部类的匿名构造函数是怎么用的

    java中匿名内部类的匿名构造函数是怎么用的下面的例子说明匿名内部类的匿名构造函数的用法 例2.7.2_0interface FigureMark_to_win {    void whoAmI(); ...

  6. 判断链表是否有环(Java实现)

    判断给定的链表中是否有环.如果有环则返回true,否则返回false. 解题思路:设置两个指针,slow和fast,fast每次走两步,slow每次走一步,如果有环的话fast一定会追上slow,判断 ...

  7. AcWing 1050. 鸣人的影分身

    题目链接 题目描述: 在火影忍者的世界里,令敌人捉摸不透是非常关键的. 我们的主角漩涡鸣人所拥有的一个招数--多重影分身之术--就是一个很好的例子. 影分身是由鸣人身体的查克拉能量制造的,使用的查克拉 ...

  8. 控制器全屏显示.不展示导航栏navigationbar

    有些时候需要 让控制器全屏显示 ,不需要导航栏,或者说是在导航栏底部 基本情况: >控制器全屏 ``` if (@available(iOS 11.0, *)) { self.tableView ...

  9. PyQt5 基本语法(四)

    目录 2. 输入控件(一) 2.1 纯键盘 2.1.1 QLineEdit 2.1.1.1 描述 2.1.1.2 控件创建 2.1.1.3 输出模式 2.1.1.4 提示字符串 2.1.1.5 清空按 ...

  10. LeetCode 剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点 题意 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点. ​ 例如,一个链表有 6 个 ...