小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

casbin基于RBAC的权限管理案例

# 中间件,golang,casbin 额外说明

收录于:17天前

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("无权限访问!")
. . .

相关推荐

额外说明

Maven打包springboot项目插件 spring-boot-maven-plugin

在不使用spring-boot-maven-plugin插件打包springboot的web项目生成的jar包是无法直接运行的。因为直接打包的jar包仅仅是一个普通的jar包,没有打包依赖也没有指定main-class,所以无法直接运行。 所以需要在po

额外说明

zk java节点查询

                      .await()是挂起的意思。等下面的方法:下面的方法是节点值改变时监听           父节点                      

额外说明

Mysql用户权限教程及实战案例

前言 本文介绍下Mysql如何控制用户的访问权限,包括创建用户、给用户授权、生产环境限制网段写权限控制、生产环境只读账号创建等实用操作。本文用通俗易懂的表述,帮你从0开始掌握Mysql用户授权。 操作环境:Mysql v5.7版本 一.查询Mysql用户

额外说明

创意之路的里程碑:平淡但不普通的创作历程

目录​​​​​​​ 1. 创作初衷 -> 文章内容主要包含 2. 收获 3. 日常 4. 努力成长 5. 憧憬  1. 创作初衷 成为创作者的第730天了, 原来也是分享和记录一些工作日常的点点滴滴, 开发实战中遇到的坎坷, 写技术类博客的目的就是让看我

额外说明

《零基础安装 Oracle 数据库》RAC集群系列 ❷ 简单两步快速安装 Oracle 12CR2 RAC 数据库

前言 很多朋友吐槽我的脚本不会用,看不懂,哎,一言难尽!于是,我将 [vagrant + virtualbox + shell脚本] 组合起来,实现了零基础也可安装 Oracle 数据库的方式,我称之为 新手纯享版本,真正一行短命令! - 支持 RAC

额外说明

推荐国产神器Eolink,提升API管理效率

       在Web前端与后端开发测试领域中,API管理工具越来越不可或缺,特别是在大型软件系统中API管理工具有着广阔的应用前景。近几年随着API管理工具的持续应用,国内也涌现出了多个API管理工具,这些国产API管理工具变得越来越火,功能也越来越强

额外说明

jsp/html.servlet与sql之间的关系

首先我们得先了解前端后端数据库之间的关系 先给大家两张关系图: 三者的关系就是:前端所想要执行的各种逻辑运算都是从后端进行操作,所有的数据都是后端从数据库拿到,然后再传给前端,由前端将所想要的内容展示出来。具体的需要各种方法和各种代码来实现。 在实现这些

额外说明

KafKa - 控制器作用 及 选举策略

一、KafKa控制器作用 在 kafka 中分为 broker 和 partition 分区,其中分区副本在前几篇文章中都进行了讲解,本篇文章针对 broker 进行分析,其中在 kafka 集群中,一个broker一般就表示一台物理机器,那机器之间的协

额外说明

PHP设计模式21-工厂模式的讲解及应用

文章目录 前言 基础知识 简单工厂模式 工厂方法模式 抽象工厂模式 详解工厂模式 普通的实现 更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的

额外说明

jQuery 将光标定位到文本框input最后一行

<div> <input type="text" id="input_1"/> </div> <script> var t=$('#input_1').val(); $('#input_1').val("").focus().val(t); </sc

ads via 小工具