【RBAC鉴权】node-casbin基础教程

一、RBAC概述

RBAC鉴权,完整的英文描述是:Role-Based Access Control,中文意思是:基于角色(Role)的访问控制。这是一种广泛应用于计算机系统和网络安全领域的访问控制模型。

简单来说,就是通过将权限分配给➡角色,再将角色分配给➡用户,来实现对系统资源的访问控制。一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。具体而言,RBAC模型定义了以下几个核心概心概念:

  • 角色(Role):角色是指在系统中具有一组相关权限的抽象概念,代表了用户在特定上下文中的身份或职能,例如管理员、普通用户等。

  • 权限(Permission):权限是指对系统资源进行操作的许可,如读取、写入、修改等。权限可以被分配给角色。

  • 用户(User):用户是指系统的实际使用者,每个用户可以被分配一个或多个角色。

  • 分配(Assignment):分配是指将角色与用户关联起来,以赋予用户相应的权限。

具体的鉴权逻辑如下图,也可以直接参考RBAC角色权限设计:

img_d55912967bd28f3392f56bd216392ec3.png

简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

二、node-casbin使用模型

这里使用nestjs脚手架做实战演练。

1、安装

# NPM
npm install casbin --save# Yarn
yarn add casbin# pnpm
pnpm add casbin

2、开始使用

node-casbin使用模型文件和策略文件新建一个执行器,有关详细信息,请参阅模型部分,也可以直接查看源码中examples目录下的模型文件:

  1. auth.controller.ts 控制器入口:

    提供api访问入口:/auth/getPermission

import { Controller, Get, Post, Body, Req } from '@nestjs/common';
import { AuthService } from '@/auth/auth.service';
import { Public } from '@/auth/decorators/public.decorator';
import { ApiTags } from '@nestjs/swagger';@Controller('auth')
@ApiTags("Auth")
export class AuthController {constructor(private readonly authService: AuthService) { }@Get('/getPermission')getPermission(): any {return this.authService.getPermission();}
}
  1. auth.services.ts 服务方法:

    提供getPermission()方法。

import { UserService } from '@/module/user/user.service';
import {Injectable
} from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { PasswordService } from './password.service';
import Permission from './permission';@Injectable()
export class AuthService {constructor() { }async getPermission(): Promise<any> {await Permission.init();const r:string = Permission.getPermission();return r;}
}
  1. permission.ts 权限控制类:
import { Enforcer, newEnforcer } from "casbin";export default class Permission {private static enforcerIns: Enforcer/*** 初始化权限实例*/public static async init() {try {const path_prefix = "src/auth/permission";   //默认指向项目根目录,不需要:/this.enforcerIns = await newEnforcer(`${path_prefix}/basic_model.conf`, `${path_prefix}/basic_policy.csv`);} catch (error) {throw new Error(error?.message);}}/*** 获取权限* @param user 用户* @param resource 要访问的资源* @param action 权限:read、write,此处权限可以进行自定义扩展*/public static async getPermission(user: string = "alice", resource: string = "data1", action: string = "read") {// 异步:const res:boolean = await this.enforcerIns.enforce(user, resource, action);// 同步:// const res = enforcer.enforceSync(sub, obj, act);if (res) {return "ok";// 允许 alice 读取 data1} else {return "error";// 访问拒绝}}
}

控制类中提供casbin权限控制器的初始化,并提供权限查询方法getPermission();

  1. basic_model.conf 模型文件:
[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

上述配置说明如下:

  • request_definition:部分用于request的定义,它明确了 e.Enforce(...) 函数中参数的含义。sub, obj, act 表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)

  • policy_definition:对policy的定义,可以理解为对上述request_definition中传入的参数的载体。例如:p = sub, obj, act就和r = sub, obj, act要一致。

  • policy_effect:策略效果的定义。 它确定如果多项政策规则与请求相符,是否应批准访问请求。例如:e = some(where (p.eft == allow))就表示只要有一个匹配的策略规则,那么就允许e = some(where (p.eft == allow)) && !some(where (p.eft == deny))就表示只要有一条匹配的策略规则,并且没有匹配拒绝的策略规则,那么就允许

  • matchers:是策略匹配程序的定义。匹配程序是表达式。它定义了如何根据请求评估策略规则。例如:m = r.sub == p.sub && r.obj == p.obj && r.act == p.act,表示请求中的主题(用户)、对象(带访问资源)和行动(操作权限)应该与政策规则中的匹配。

    关于模型语法的更多说明,请查看casbin模型语法

  1. basic_policy.csv 策略文件:
p, alice, data1, read
p, bob, data2, write

上述配置意味着:

  • alice可以读取data1
  • bob可以编写data2

3、执行

这时候我们发起POST请求/auth/getPermission后,在permission.ts控制器中查看结果,可以看到权限是true

image-20240502172702832

不同入参对应的权限判断结果如下:

Permission.getPermission("alice", "data1", "read");		//有权限:true
Permission.getPermission("alice", "data1", "write");	//无权限:false
Permission.getPermission("bob", "data2", "write");		//有权限:true
Permission.getPermission("bob", "data2", "read");		//无权限:false

4、动态添加策略

用户或者角色有什么对应角色,我们一般是存储在数据库中,那么我们就需要动态读取数据库的权限策略。node-casbin中是提供了addPolicy(user, resource, action)方法。

permission.ts 文件

import { Enforcer, newEnforcer } from "casbin";export default class Permission {private static enforcerIns: Enforcer/*** 初始化权限实例*/public static async init() {try {const path_prefix = "src/auth/permission";   //默认指向项目根目录,不需要:/this.enforcerIns = await newEnforcer(`${path_prefix}/basic_model.conf`, `${path_prefix}/basic_policy.csv`);// 读取mysql数据,并在此处批量添加策略// await this.enforcerIns.addPolicy("bob", "data2", "read");		//单个添加await this.enforcerIns.addPolicies([["bob", "data2", "read"]]);	//批量添加} catch (error) {throw new Error(error?.message);}}/*** 获取权限* @param user 用户* @param resource 要访问的资源* @param action 权限:read*/public static async getPermission(user: string = "alice", resource: string = "data1", action: string = "read") {const res = await this.enforcerIns.enforce(user, resource, action);if (res) {return "ok";} else {return "error";}}
}

5、分组模型和略测配置

# 模型
[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[role_definition]
g = _, _[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
#策略
p, alice, data1, read
p, bob, data2, write
p, data2_admin, data2, read
p, data2_admin, data2, write
g, alice, data2_admin

上述策略表示:

  • alicedata1read权限
  • bobdata2write权限
  • data2_admin角色对data2read权限
  • data2_admin角色对data2write权限
  • alice属于data2_admin角色

6、其他Api

  • enforcerIns.LoadModel():从*.conf文件重新加载模型
  • enforcerIns.LoadPolicy():从*.csv文件中重新加载策略
  • enforcerIns.SavePolicy():把当前策略重新写入*.csv文件
  • enforcerIns.removePolicies([["bob", "data2", "read"]]):批量删除策略
  • enforcerIns.removePolicy("alice", "data1", "read"):删除策略
  • enforcerIns.getRolesForUser("alice"):读取用户归属的角色

更多Api请查看:Adapters

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

为人处事电影解说,全新升级瀚海跑道一分钟一条视频,全平台可推广,轻轻松松日入1000

自古以来&#xff0c;我国流行的一种现象是&#xff0c;大多数人都会与领导或上司打交道。由于某些话题不宜公开讨论&#xff0c;因此出现了许多含蓄的表达方式。随着年龄的增长&#xff0c;人们的态度也发生了变化&#xff0c;从最初的轻视到现在的重视。 下 载 地 址&#…

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

【C++】vector类的增删改查模拟实现(图例超详细解析!!!)

目录 一、前言 二、源码引入 三、vector的模拟实现 ✨实现框架 ✨前情提要 ✨Member functions —— 成员函数 ⚡构造函数 ⭐无参构造 ⭐迭代器区间构造 ⭐n个值构造 ⚡拷贝构造 ⚡运算符赋值重载 ⚡析构函数 ✨Element access —— 元素访问 ⚡operator[ ] …

C语言 | Leetcode C语言题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize,int* obstacleGridColSize) {int n obstacleGridSize, m obstacleGridColSize[0];int f[m];memset(f, 0, sizeof(f));f[0] (obstacleGrid[0][0] 0);for (int i…

融创共赢,算网领航 | 移动云智能芯片开放实验室正式发布

4月29日上午&#xff0c;中国移动算力网络大会“融创共赢&#xff0c;算网领航-算网原生技术”分论坛在苏州金鸡湖国际会议中心顺利召开&#xff0c;中国移动云能力中心副总经理吴世俊出席论坛并发表致辞。大会举行了智能芯片开放实验室发布仪式&#xff0c;同时发布移动云最新…

服务器IP选择

可以去https://ip.ping0.cc/查看IP的具体情况 1.IP位置--如果是国内用&#xff0c;国外服务器的话建议选择日本&#xff0c;香港这些比较好&#xff0c;因为它们离这里近&#xff0c;一般延时低&#xff08;在没有绕一圈的情况下&#xff09;。 不过GPT的话屏蔽了香港IP 2. 企…

2024年税务师报名照片处理工具使用详细教程✅

第1️⃣步&#xff1a;登陆税务师考试报名入口 第2️⃣步&#xff1a;登陆税务师考试报名入口 第3️⃣步&#xff1a;下载税务师报名照片处理工具 第4️⃣步&#xff1a;双击打开照片检测工具 第5️⃣步&#xff1a;点击“打开照片文件”上传合规照片 第6️⃣步&#xff1a;在对…

JAVA面试题---WEB部分

网络通讯 TCP与UDP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、 可靠的、 基于 IP 的传输层协议。 UDP 是 User Datagram Protocol 的简称&#xff0c;中文名是用户数据报协议&#xff0c;是 OSI 参考模 型中的传输层协议&#xff0c;它是…

用WebUI生成一个毛茸茸的图标教程

&#x1f680;内容概要 好久没有更新webui的教程了&#xff0c;五一期间刷新liblib&#xff0c;发现更新了几个有趣的lora&#xff0c;正好这段时间看到有朋友发了毛绒图标&#xff0c;所以这里做了一个简单的webui 教程&#xff0c;教你如何一步生成毛绒图标&#xff0c;就像…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

『跨端框架』Flutter环境搭建

『跨端框架』Flutter环境搭建 资源网站简介跨平台高性能发展历程跨平台框架的比较成功案例 环境搭建&#xff08;windows&#xff09;基础环境搭建Windows下的安卓环境搭建Mac下的安卓环境配置资源镜像JDKAndroid StudioFlutter SDK问题一问题二问题三修改项目中的Flutter版本 …

HANA小知识点记录:SQL JOIN 条件中的条件判断(CASE WHEN )

今天写sql的时候要用到这个&#xff0c;查到其他数据库是这么写的&#xff1a; 在hana里试了下上面那样写不行&#xff0c;试了一下可以这么写&#xff0c;满足需求 LEFT JOIN "SAPHANADB"."/BI0/PCUSTOMER" AS F-- 通过附加客户关联客户主数据 ON CASE W…

探索高级聚类技术:使用LLM进行客户细分

在数据科学领域&#xff0c;客户细分是理解和分析客户群体的重要步骤。最近&#xff0c;我发现了一个名为“Clustering with LLM”的GitHub仓库&#xff0c;它由Damian Gil Gonzalez创建&#xff0c;专门针对这一领域提供了一些先进的聚类技术。在这篇文章中&#xff0c;我将概…

Redis__事务

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__事务 ⏱️ 创作时间&#xff1a;2024年05月02日 ———————————————— 这里写目录标题 文章目…

【hackmyvm】vivifytech靶机

渗透思路 信息收集端口扫描端口服务信息目录扫描爆破hydra--sshgit提权 信息收集 ┌──(kali㉿kali)-[~] └─$ fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.119 --主机 192.168.9.164 --靶机个人习惯&#xff0c;也方便后续操作&#xff0c;将IP地址赋值给一个变…

微软如何打造数字零售力航母系列科普07 - Azure PlayFab:你从未想过的世界上最大的开发工具(平台)

Azure PlayFab&#xff1a;你从未想过的世界上最大的开发工具 微软的James Gwertzman告诉GamesIndustry.biz Academy他帮助开发者成功的使命 制作游戏比以往任何时候都更容易上手。现在有无数的游戏引擎可供选择&#xff0c;其中大多数是免费的&#xff0c;PC空间的店面也同样重…

高中数学:三角函数公式汇总及推导

一、定义 常用三角函数值 参考&#xff1a; 三角函数定义 二、基本三角函数及相互关系 sinx cosx tanx cscx secx cotx 函数间相互关系 参考&#xff1a; cosx、sinx、tanx的函数图像与性质 secx、cscx、cotx函数图像及相关关系 三、诱导公式 口诀&#xff1a;奇变…

RK3568平台(时间篇)看门狗

一.看门狗原理 在产品化的嵌入式系统中&#xff0c;为了使系统在异常情况下能自动复位&#xff0c;一般都需要引入看门狗。 看门狗其实就是一个可以在一定时间内被复位的计数器。当看门狗启动后&#xff0c;计数器开始自动计数&#xff0c;经过一定时间&#xff0c;如果没有被…

私有开源LLM实例的三个考虑因素

原文地址&#xff1a;three-considerations-for-private-open-source-llm-instances 2024 年 4 月 29 日 在生产应用中使用商业 LLM APIs 会带来明确且经过充分研究的风险。因此&#xff0c;企业越来越多地转向利用开源的私有托管LLM实例&#xff0c;并通过RAG技术进行增强。 介…

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式&#xff0c;下面详细解释并提供相应的举例&#xff1a; 使用var关键字声明的全局变量&#xff1a; var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量&#xff08;不推荐使用&…