casbin基于RBAC的权限管理案例

news2024/11/16 11:33:42

在RBAC模型中新定义了角色和继承关系,用户可以通过角色区分不同的权限,继承不同的角色时用户有多个权限。

[role_definition]
g = _, _
g2 = _, _

g 是一个 RBAC系统, g2 是另一个 RBAC 系统。 _, _表示角色继承关系的前项和后项,即前项继承后项角色的权限。

在策略存储的数据为:

p, data2_admin, data2, read
g, alice, data2_admin

这意味着 alice 是角色 data2_admin的一个成员。 alice 在这里可以是用户、资源或角色。 Cabin 只是将其识别为一个字符串。

casbin只验证字符串的准确性,因此是否存在这个角色需要开发者验证,cabin不能循环继承会发生死锁。

用户权限和角色信息都存储在策略表中,如策略数据一样:p,_ , _ , _和g , _ , _ 。

在这里插入图片描述
rbac API提供了若干方法用户操作用户权限和角色:

  • 添加用户
Enfocer.AddPolicy("bob", "/v1/home", "read")
  • 添加角色
Enfocer.AddRoleForUser("bob", "user")
  • 获取用户角色
Enfocer.GetRolesForUser("bob")
  • 获取角色用户
Enfocer.GetUsersForRole("user")
  • 判断用户是否存在该角色
Enfocer.HasRoleForUser("bob", "user")
  • 添加多个角色
Enfocer.AddRolesForUser("alice", []string{"user1", "user2", "user3"})
  • 删除角色
Enfocer.DeleteRoleForUser("alice", "user3")

更多移步https://casbin.org/zh/docs/rbac-api

rbac模型既可以通过用户名来进行权限控制,也可通过角色进行权限控制。例如在官方的编辑器中:

在这里插入图片描述
Pollic中就同时使用用户名和角色来控制权限。一般情况是用户拥有角色,角色控制权限。

那么在添加用户时,第一个参数就变成角色

Enfocer.AddPolicy("user", "/v1/home", "read")

那么验证逻辑如下:

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	xormadapter "github.com/casbin/xorm-adapter/v2"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"xorm.io/xorm"
)

var Enfocer *casbin.Enforcer

var DB *xorm.Engine

func init() {
	//数据库引擎配置
	engine, err := xorm.NewEngine("mysql", "root:root@/test?charset=utf8")
	if err != nil {
		log.Printf("数据库驱动错误:%v", err)
		return
	}
	DB = engine
	//casbin适配器配置
	a, err := xormadapter.NewAdapter("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8", true)
	if err != nil {
		log.Printf("连接数据库错误:%v", err)
		return
	}
	e, err := casbin.NewEnforcer("rbac/model.conf", a)
	if err != nil {
		log.Printf("初始化casbin错误:%v", err)
		return
	}

	Enfocer = e
}


//根据用户名获取角色信息
roles, err := Enfocer.GetRolesForUser("bob")
if err != nil {
	log.Printf("系统错误:%v", err)
}
//通过请求获取url地址和其他验证参数
url := "/v1/home"
param := "read"

//casbin规则匹配
for _, item := range roles {
	flag, err := Enfocer.Enforce(item, url, param)
	if err != nil {
		log.Printf("系统错误:%v", err)
		return
	}
	if flag == false {
		continue
	} else {
		fmt.Println("验证通过!")
		return

	}
}
fmt.Println("无权限访问!")

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

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

相关文章

局部探索测试的要素

局部探索测试的要素 局部探索测试是软件测试过程中的一种方法,旨在发现一个系统、软件或应用程序的局部缺陷和问题。局部探索测试不是全面测试,而是通过对特定功能、模块或环节进行测试来检查其中潜在的缺陷,从而提高软件的质量和可靠性。 局…

【白话机器学习系列】白话Broadcasting

白话 Broadcasting 文章目录 什么是 BroadcastingBroadcasting 的规则逐元素操作向量与标量运算矩阵与向量运算行向量列向量 张量与向量运算张量与矩阵运算 矩阵与张量的点积总结 什么是 Broadcasting 在 《白话张量》 中我们讲过,张量之间进行运算需要满足一定的…

Hadoop之MapReduce概述

MapReduce概述 MapReduce定义MapReduce优缺点MapReduce核心思想MapReduce进程MapReduce编程规范MapTask并行度决定机制ReduceTask并行度决定机制mapreduce中job的提交流程MapReduce工作流程shuffle机制分区partition数据清洗(ETL)进一步分析MapTask和Red…

Jenkins+RF持续集成测试(二) 定时更新SVN完成构建

在上一篇中讲了Jenkins的安装,这篇将介绍 定时从SVN库中(git库与之类似,这里就不具体介绍了,有需要自己折腾)拉取最新的测试脚本,完成jenkins的定时构建。这是我们做自动化测试最基本的环节,每天…

【Linux】还在用top命令?可以试试atop工具,信息一目了然,运维工程师的新选择

atop使用 Linux以其稳定性,越来越多地被用作服务器的操作系统(当然,有人会较真地说一句:Linux只是操作系统内核:)。但使用了Linux作为底层的操作系统,是否我们就能保证我们的服务做到7*24地稳定呢?非也,要…

06.05

1.二进制求和 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法:先将 aaa 和 bbb 转化成十进制数,求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算,我们可以很简单地写出这…

发现问题更全面,减少测试成本:WEB自动化测试的价值分析!

目录 前言: 一、WEB自动化测试的价值 1. 提高测试效率 2. 提高软件的质量 3. 减少测试成本 二、WEB自动化测试的瓶颈 1. 可维护性差 2. 兼容性问题 3. 比手工测试慢 三、代码示例 四、总结 前言: 自动化测试是软件开发中必不可少的一环&…

shell简单命令

命令入门: [rootlocalhost ~]# #/root [jinxflocalhost ~]$ #/home/jinxf 用户名主机名 当前目录 #系统权限 $普通权限 命令格式 命令 选项 参数(三者之间要有空格,区分大小写) command [-options] [args]…

004-从零搭建微服务-认证中心(四)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址:https://gitee.com/csps/mingyue 文档地址:https://gitee.com/csps/mingyue/wikis 搭建前端框架 感谢开源项目【vue-next-adm…

最厉害的缓存框架,没有之一!

Redis有多火爆? 现在阿里、腾讯这样的大厂和大部分互联网公司,基本上都需要使用到Redis技术。网上发布的Java开发工程师岗位的招聘信息,对Redis的要求都是熟练掌握。 而且现在大厂的大部分面试题都和Redis有关,尤其是在阿里、字节…

在 iPhone 和 Android 上恢复已删除的微信消息/聊天的 3 种方法

微信是一款面向移动用户的免费即时通讯应用程序。它适用于 iOS 和 Android。 好消息是,在微信 经历了如此艰难的运行之后,它仍在我们身边,并将在其新所有者恢复工具的帮助下继续发展。 微信 是一个相当受欢迎消息应用程序。非常简单易用&am…

【论文阅读】Megatron-LM要点

Megatron-LM论文要点 本文主要是对李沐老师的b站分享做一下自己的理解和总结。 李沐老师b站分享 模型结构无非就是那样,相比而言,想要训练更大的模型而又能平稳进行,是一项非常高超的技术! nvidia 跟gpipe类似,也是…

mysql中sql语句之分组(group by)

文章目录 前言分组查询定义语法说明 group by使用group by group_concat()的使用group by 聚合函数的使用group by having的使用group by with rollup的使用分组查询小结 前言 今天遇到公司新来的小伙伴咨询问题,统计集团内部的在职员工与离职员工数量&#xf…

负载不堵塞,稳定可靠,企业性能测试指南!

目录 前言: 基准测试 - 确认你的产品在正常使用条件下的性能 负载测试 - 确认你的产品在高负荷下的性能 压力测试 - 确认你的产品的极限性能 稳定性测试 - 确认你的产品在长时间高负荷下的表现 总结 前言: 在当今竞争激烈的商业环境中,…

我敢说,这是科普路由协议的最高境界

大家好,我是许公子。 路由协议,经常看我文章的小友都知道,给你们说过很多期了。 这是网络世界里,很重要的一个概念,总得来说,它负责将数据包从源节点传递到目的节点。 最近又有很多萌新关注过来&#xff…

C语言:计算n的阶乘(不考虑溢出)

题目: 从键盘输入一个值n,计算n的阶乘, 如:输入5,计算5的阶乘 --> 5! 1 * 2 * 3 * 4 * 5 思路: 第一步: 创建一个变量 ret ,用来存放每次相乘后的值, 因为 0 乘 任何…

uipath 实现连接pg数据库

1、下载ODBC 如需要使用UiPath连接数据库进行操作,需要先准备必需条件先安装ODBC。 postgresql ODBC下载链接:https://www.postgresql.org/ftp/odbc/versions/msi/ 下载最新的安装包即可。 2、配置ODBC 下载完pgsql ODBC的安装包直接打开压缩包进行…

实验篇(7.2) 07. 通过安全隧道访问指定网站 (SSL) ❀ 远程访问

【简介】通过前面的实验,我们已经了解了SSL VPN的隧道模式。FortiClient客户端拨号后,访问服务器IP的流量,会通过安全隧道到达远端防火墙,并访问DMZ接口下的服务器。那如果我想让更多的访问走安全隧道,但是又不确定是哪…

最受欢迎的十个开源大数据技术

导读大数据已然成为当今最热门的技术之一,正呈爆炸式增长。每天来自全球的新项目如雨后春笋般涌现。幸运地是,开源让越来越多的项目可以直接采用大数据技术,下面就来盘点最受欢迎的十大开源的大数据技术。 大数据已然成为当今最热门的技术之…

热烈庆祝兴业法拍网与中关村科技融资担保有限公司签订业务合作

6月1日,兴业法拍网与北京中关村科技融资担保有限公司签订“法拍贷”合作协议。 “法拍贷”是以法院房产拍卖为核心、线上平台拓宽拍卖渠道、保险公司提供阶段性保证、公证机构加大司法效力、银行提供全程金融服务的“14”创新合作模式。该模式汇聚五方合力让更多竞…