Casbin Demo实例(支持CSV和MySQL两种策略规则)

2023-05-16

Casbin

帮助文档地址:https://casbin.org/docs/zh-CN/how-it-works

常见的设计模式(DAC,MAC,RBAC,ABAC)

0.基于权限的角色控制 RBAC

1.基于属性的权限验证(ABAC: Attribute-Based Access Control)

创建一个Casbin决策器需要有一个模型文件和策略文件为参数:

特性:

1.支持自定义请求的格式,默认的请求格式为{subject, object, action}。
2.具有访问控制模型model和策略policy两个核心概念。
3.支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
4.支持超级用户,如 root 或 Administrator,超级用户可以不受授权策略的约束访问任意资源。
5.支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

Casbin不执行的操作:

  1. 身份验证(又名验证username以及password用户登录时)
  2. 管理用户或角色列表。我相信项目本身管理这些实体会更方便。用户通常具有其密码,而Casbin并非设计为密码容器。但是,Casbin存储RBAC方案的用户角色映射。

模型文件:model.conf

# Request definition
[request_definition] 自定义请求的格式
r = sub, obj, act
 
# Policy definition
[policy_definition] 策略定义
p = sub, obj, act
 
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
 
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

&& (r.act == p.act || p.act == “")//注意最后一行的p.act="”,这个意思是说忽略客户端浏览器发起的请求类型,即不分辨GET、POST、FETCH等http方法。

采用本地csv格式的Demo

策略文件:

p, superAdmin, project, read
p, superAdmin, project, write
p, admin, project, read
p, admin, project, write
p, admin, asse, read
p, admin, asse, write
p, zhuangjia, project, write
p, zhuangjia, asse, write
p, shangshang, project, read
p, shangshang, asse, read

g, quyuan, admin
g, wenyin, zhuangjia

main文件

package main

import (
	"fmt"
	"log"

	"github.com/casbin/casbin"
)

func main() {
	TestRBAC()
}

func TestRBAC() {
	e, _ := casbin.NewEnforcer("rbac_model.conf", "rbac.csv")
	fmt.Printf("RBAC test start\n") // output for debug

	// superAdmin
	if aa, err := e.Enforce("superAdmin", "project", "read"); err == nil {
		if aa {
			log.Println("superAdmin can read project")
		}else{
			log.Fatal("ERROR: superAdmin can not read project")
		}
	} else {
		fmt.Println("err1", err)
	}
	
}

采用读取数据方式的Demo

策略文件:casbin_rule.sql

表有,ptype,v0,v1,v2,v3,v4,v5.目前只使用到ptype,v0,v1,v2

ptype写死为p,v0为角色,v1为操作路径v2为方式,如:例如ptype:p,v0:admin,v1:/api/v1/aa,v2:GET

/*
Navicat MySQL Data Transfer

Source Server         : 192.168.10.203
Source Server Version : 50646
Source Host           : 192.168.10.203:3306
Source Database       : wingo_dev

Target Server Type    : MYSQL
Target Server Version : 50646
File Encoding         : 65001

Date: 2020-07-14 10:02:17
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `casbin_rule`
-- ----------------------------
DROP TABLE IF EXISTS `casbin_rule`;
CREATE TABLE `casbin_rule` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `p_type` varchar(255) NOT NULL,
  `v0` varchar(255) NOT NULL,
  `v1` varchar(255) NOT NULL,
  `v2` varchar(255) NOT NULL,
  `v3` varchar(255) NOT NULL,
  `v4` varchar(255) NOT NULL,
  `v5` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of casbin_rule
-- ----------------------------
package main

import (
	"fmt"
	"net/http"

	"github.com/casbin/casbin"
	"github.com/casbin/gorm-adapter"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
)

func main() {

	a, err := gormadapter.NewAdapter("mysql", "root:123456@tcp(192.168.10.203:3306)/test_casbin", true)
	if err != nil {
		fmt.Println("NewAdapter", err)
	}
	//创建一个Casbin决策器需要有一个模型文件和策略文件为参数:
	e, err := casbin.NewEnforcer("rbac_model.conf", a)
	if err != nil {
		fmt.Println("NewEnforcer", err)
	}
	//从DB加载策略
	e.LoadPolicy()

	//获取router路由对象
	r := gin.New()
	//使用自定义拦截器中间件
	r.Use(LanjieqiHandler(e))
	//创建请求
	r.GET("/api/v1/aa", func(c *gin.Context) {
		var message string = "成功"
		var code int = 200
		var aa string = "data"
		c.JSON(http.StatusOK, gin.H{
			"code":    code,
			"message": message,
			"data":    aa,
			"result":  "true",
		})
	})

	r.Run(":9090") //参数为空 默认监听8080端口
}

//拦截器
//拦截器
func LanjieqiHandler(e *casbin.Enforcer) gin.HandlerFunc {

	return func(c *gin.Context) {

		//获取请求的URI
		obj := c.Request.URL.RequestURI()
		//获取请求方法
		act := c.Request.Method
		//获取用户的角色
		sub := "admin"

		//判断策略中是否存在
		aa, err := e.Enforce(sub, obj, act)
		if err != nil {
			fmt.Println("e.Enforce error")
		}
		if aa {
			fmt.Println("通过权限")
			c.Next()
		} else {
			fmt.Println("权限没有通过")
			c.Abort()
		}
	}
}
访问地址:http://127.0.0.1:9090/api/v1/aa
返回结果:{"code":200,"data":"data","message":"成功","result":"true"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Casbin Demo实例(支持CSV和MySQL两种策略规则) 的相关文章

  • MySQL 中布尔值的 TINYINT 与 ENUM(0, 1)

    MyISAM 表和 MySQL 5 1 中具有 0 和 1 值的 Tinyint 或 ENUM 0 1 哪个更好 您可以使用BIT 1 如中提到的MySQL 5 1 参考 http dev mysql com doc refman 5 1
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car
  • 如何将一行分成多行?

    我有一个 CSV 文件 看起来像这样 Column1 Column2 Column3 John Smith AA AH CA NI PB Reginald Higginsworth AA AH CA NI PB SN ZS 您会注意到其中有
  • 从 MySQL 将 500 万行加载到 Pandas 中

    我在 本地 网络上的 MySQL 数据库中有 500 万行 连接速度非常快 而不是在互联网上 与数据库的连接工作正常 但如果我尝试这样做 f pd read sql query SELECT FROM mytable engine inde
  • 使用 MySQL 的 CURDATE() 或 PHP 的 date() 更快?

    使用mysql查询是不是更快 SELECT CURDATE as today 或 PHP 语句 curdate date Y m d 同样的答案是否适用于使用date VS MySQL 的NOW and CURTIME 如果您只是执行查询以
  • 用于全文搜索和 2 亿多条记录的数据库

    我即将创建一个包含至少 2 亿个条目的庞大数据库 数据库需要可使用全文进行搜索 并且速度应该很快 我的数据库从许多不同的数据源获取数据 我需要定期导入新的或更新的数据 将我的所有数据存储在像 mysql 这样的关系数据库中 然后创建一个 n
  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • 是否可以使用 csv.DictReader 保持列顺序?

    例如 我的 csv 有如下列 ID ID2 Date Job No Code 我需要以相同的顺序写回各列 这dict立即打乱了顺序 所以我相信这更多是读者的问题 蟒蛇的dicts 在 3 6 之前不维持顺序 但是 无论如何 在该版本中csv
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • MySQL - 查找接近的匹配项

    MySQL 有没有办法在文本字段中找到紧密匹配的内容 说找到 email protected cdn cgi l email protection当搜索时 email protected cdn cgi l email protection
  • 在 SQL 中如何获得整数的最大值?

    我试图从 MySQL 数据库中找出整数 有符号或无符号 的最大值 有没有办法从数据库本身提取这些信息 是否有我可以使用的内置常量或函数 标准 SQL 或 MySQL 特定的 At http dev mysql com doc refman
  • java.lang.NoSuchMethodError:没有虚拟方法 setTag(Ljava/lang/Object;)

    我刚刚完成使用登录和注册屏幕与齐射的代码 但在模拟器中运行时我收到此错误 java lang NoSuchMethodError No virtual method setTag Ljava lang Object Lcom android
  • 使用表白名单选项更新 Debezium MySQL 连接器

    我正在使用 Debezium 0 7 5 MySQL 连接器 并且我试图了解如果我想使用以下选项更新此配置 最好的方法是什么table whitelist 假设我创建了一个连接器 如下所示 curl i X POST H Accept ap
  • Laravel 读写连接不同步

    我在 Laravel 5 2 应用程序中使用读写 MySQL 连接设置 mysql gt write gt host gt env DB HOST WRITE localhost read gt host gt env DB HOST RE
  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • parent_id 是外键(自引用)并且为 null?

    浏览 Bill Karwin 的书 SQL Antipatterns 第 3 章 Naive Trees 邻接表 父子关系 有一个注释表的示例 CREATE TABLE Comments comment id SERIAL PRIMARY
  • Mysql加密/存储敏感数据,

    我的 PHP 网站有以下内容 启用 SSL 饼干 session set cookie params cookieParams lifetime cookieParams path cookieParams domain secure ht

随机推荐

  • GDI GDI+ 的区别

    转载自 xff1a http www cnblogs com lidabo p 3701252 html GDI 43 是GDI的下一个版本 xff0c 它进行了很好的改进 xff0c 并且易用性更好 GDI的一个好处就是你不必知道任何关于
  • 使用的DockPanel的心得

    使用这个控件的时候后一定要先Show this DockPlan1 才能使用DockTo this DockPlan1 DockStyle Bottom 固定位置 xff0c 否则会抛出异常
  • C#使用双缓冲解决绘图闪屏的问题

    最近在工作需要使用C 绘制图形 xff0c 看了一下绘制的函数觉得很简单就开始着手工作了 xff0c 但是在实际应用的时候发现鼠标进行绘制的时候会闪屏 xff0c 原因是图元重绘的时间不一致 xff0c 百度一下有很多更详细的 xff0c
  • 关于捕获键盘信息的processDialogkey方法

    转载自 xff1a http blog csdn net lucifinil s article details 6318189 在一些控件里的keydown方法 xff0c 没有办法捕获所有的按键消息 比如自己写一个窗体控件库 xff0c
  • C#泛型委托

    因为项目原因最近要使用C 进行编程 xff0c 于是每天现学现卖一点一点的进行开发 之前很长的时间一直使用C和C 43 43 进行编程 xff0c 于是转到C 一开始开始不是特别适应的 xff0c 特别是C 这门语言没有了指针 xff0c
  • 基于windows的Ubuntu双系统安装

    Data 2016 12 19 Author cjh Theme Ubuntu dual system installation 前期准备 1 Ubuntu相关版本镜像ios 2 UltraISO 用于制作U盘启动盘 3 EasyBCD 2
  • 汇编文件.S和.s的区别

    c C 原始程序 xff1b 预处理 编译 汇编 C C 43 43 原始程序 xff1b 预处理 编译 汇编 ccC 43 43 原始程序 xff1b 预处理 编译 汇编 cxx C 43 43 原始程序 xff1b 预处理 编译 汇编
  • 串口网口数据帧解析(支持连包、断传、错误数据过滤)

    本文转载自 xff1a https blog csdn net hwb 1988 article details 45872379 嵌入式系统中 xff0c 关于数据接受部分确实思考了很多 xff0c 下面总结下个人经验 关于串口传输 xf
  • Use of $Super$ $  and$Sub$ $to patch symbol definitions

    在无法修改现有符号的情况下 xff0c 可以使用特殊模式 现有符号无法修改 xff0c 例如 xff0c 如果它位于外部库或ROM代码中 在这种情况下 xff0c 您可以使用 Super 和 Sub 模式来修补现有符号 修补函数foo xf
  • RT-Thread内核移植

    记录代码移植过程 xff0c 成功一步记录一步 第一步 xff1a 建立裸机程序 使用STM32CubeMx建立一个裸机程序 生成MDK5工程 第二步 xff1a 参考0 bare metal完成board c board h文件 在Dri
  • C#委托和事件框架封装简写 delegate、event、Action、EventHandler

    曾经 Net大佬只有一个Delegete 委托 xff0c 别人想用委托的时候 xff0c 必须得用delegate关键字来定义一个委托 xff0c 就像这样 span class token comment 定义一个无返回值的 xff0c
  • CentOS 7 firewalld使用简介

    学习apache安装的时候需要打开80端口 xff0c 由于centos 7版本以后默认使用firewalld后 xff0c 网上关于iptables的设置方法已经不管用了 xff0c 想着反正iptable也不会用 xff0c 索性直接搬
  • 通过VNC访问docker容器的图形界面

    https hub docker com r dorowu ubuntu desktop lxde vnc https github com fcwu docker ubuntu vnc desktop docker ubuntu vnc
  • 阿里云产品图标

    2022年最新 最全的阿里云产品图标 xff0c 矢量图哦 xff0c 留下你的邮箱 xff0c 我发给你 2022年最新阿里云产品图标 有200多个图标 随时可以拿来用 为了可以审批通过 我在这里多写点字 我平时都是用这些图标 用来做设计
  • 论文引用:参考文献GB/T 7714、APA、MLA的自动生成

    一 谷歌学术 1 谷歌学术镜像 xff1a 谷歌学术镜像 Google学术搜索导航 64 思谋学术 xff0c 随意点进去一个链接 2 搜索需要的论文 xff0c 点击下方引用小标志 3 根据自己需要的引用标准 xff0c 选择复制 注 x
  • 人工智能与安全论坛:智能与安全的融合与对抗

    前几天随公司参加了互联网安全大会 xff08 ISC xff0c Internet Security Conference xff09 xff0c 虽然只参加了半天的会议 xff0c 感觉收获不 更重要的是偶遇师兄 xff0c 人生无处不相
  • Jetson TX1刷机历险记

    Data 2016 12 19 Author cjh Theme Jetson TX1 Brush 这两天刚到了英伟达的jetson tx1 开发板 xff0c 之前也看了写资料 xff0c 感觉应该很充分刷机应该没有问题才对 xff0c
  • curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused 解决方法

    问题 xff1a 报错 curl 7 Failed to connect to raw githubusercontent com port 443 Connection refused 解决方法 xff1a 参考 xff1a https
  • GailHoward

    全球著名彩票预测家美国人 xff27 xff41 xff49 xff4c xff28 xff4f xff57 xff41 xff52 xff44 发明的 旋转系统 选号法已经造就了 xff17 xff14 个大奖得主 xff0c 这是一种基
  • Casbin Demo实例(支持CSV和MySQL两种策略规则)

    Casbin 帮助文档地址 xff1a https casbin org docs zh CN how it works 常见的设计模式 xff08 DAC xff0c MAC xff0c RBAC xff0c ABAC xff09 0 基