结合 Casbin 对 http 请求做 RBAC 鉴权以及添加请求路由参数支持

2023-05-16

目录

总结

背景

实操

安装 Casbin

创建一个 Casbin 模型

创建一个 Casbin 策略

加载 Casbin 模型和策略并创建一个路由


总结

在本文中,我们将介绍如何结合 Casbin 对 HTTP 请求进行基于角色的访问控制 (RBAC) 鉴权,并支持请求路由参数。我们将使用 Go 语言中的 Casbin 库。

背景

Casbin 是一个支持访问控制模型的库,可以轻松地集成到你的应用程序中。它支持多种访问控制模型,包括 RBAC、ABAC 等,可以与各种后端存储库(如文件、数据库等)集成,方便管理访问控制策略。

在本文中,我们将使用 Casbin 来实现基于 RBAC 的访问控制,为 HTTP 请求提供鉴权支持。

实操

安装 Casbin

首先,我们需要安装 Casbin 库。你可以使用以下命令进行安装:

go get -u github.com/casbin/casbin

 

创建一个 Casbin 模型

在 Casbin 中,模型用于定义访问策略,包括角色、资源和操作。下面是一个简单的 Casbin 模型示例:

[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) && keyMatch2(r.obj, p.obj) && r.act == p.act

 在上述 Casbin 模型中,我们定义了访问控制的请求、策略、角色和匹配器。具体来说,请求定义包括三个属性:请求主体 sub、请求对象 obj 和请求操作 act。策略定义和请求定义类似,包括三个属性:策略主体 sub、策略对象 obj 和策略操作 act。角色定义包括两个属性:角色名称 g 和角色成员 _,其中 _ 表示角色成员可以是任何字符串。我们使用 g 来定义角色之间的层级关系。匹配器定义了如何匹配请求和策略。

简单来说,就是请求的 sub 主体必须继承了策略的 sub 主体,我们使用 keyMatch2 函数来匹配请求对象和策略对象,而请求操作 act 则必须完全匹配。

keyMatch2 是 Casbin 中的一个匹配函数,用于在请求对象和策略对象中匹配带有通配符的字符串。

具体来说,keyMatch2 函数支持通配符 冒号 (:) ,可以匹配任意长度的字符串。举个例子,假设我们有一个请求对象 /users/123,策略对象为 /users/:id,那么这两个对象就可以被 keyMatch2 函数匹配成功,因为 通配符可以匹配任意长度的字符串。

除了 keyMatch2 函数,Casbin 还支持其他的匹配函数,比如 keyMatchregexMatch 等。这些匹配函数可以帮助我们更加灵活地定义访问控制策略,以适应不同的业务场景。具体参考:

casbin——matchers中的函数

创建一个 Casbin 策略

在 Casbin 中,策略用于定义实际的访问控制规则。你可以将策略存储在不同的后端(如数据库或文件)中。下面是一个简单的 Casbin 策略示例:

p, member, /depts, GET
p, member, /depts/:id, GET

p, admin, /depts, POST
p, admin, /depts/:id, PUT
p, admin, /depts/:id, DELETE

g, admin, member
g, zhangsan, admin
g, lisi, member

在上述的 Casbin 策略中,实际上我们定义了四个角色:adminmemberzhangsanlisi

其中,admin 角色拥有对 /depts 路径下的所有请求操作的访问权限;member 角色仅拥有对 /depts/depts/:id 路径下的 GET 请求操作的访问权限;zhangsan 角色继承了admin 角色的访问权限,因此也同样拥有对 /depts 路径下的所有请求操作的访问权限;lisi 角色仅拥有 member 角色的访问权限。

此外,我们使用冒号 (:) 来表示路径参数,表示请求对象可以是一个具有参数的路径。这样,我们就可以更加灵活地定义访问控制策略,以适应不同的业务场景。

加载 Casbin 模型和策略并创建一个路由

接下来,我们将创建一个名为 main.go 的 Go 文件,并添加以下代码:

package main

import (
	"github.com/casbin/casbin"
	"log"
	"net/http"
)

func main() {
	// 创建 Casbin 模型
	e := casbin.NewEnforcer("model.conf", "policy.csv")

	// 创建 HTTP 处理程序
	http.HandleFunc("/depts/", func(w http.ResponseWriter, r *http.Request) {
		// 获取当前用户、请求路径和请求方法
		user := r.Header.Get("X-User")
		path := r.URL.Path
		method := r.Method

		// 检查当前用户是否有权限访问该路径
		if !e.Enforce(user, path, method) {
			http.Error(w, "Forbidden", http.StatusForbidden)
			return
		}

		// 如果有权限,则继续处理请求
		// TODO: 处理请求
	})

	// 启动 HTTP 服务器
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal(err)
	}
}

在上面的代码中,我们首先创建了一个 Casbin 模型,以及一个名为 /depts/ 的 HTTP 处理程序。在处理程序中,我们获取了当前用户、请求路径和请求方法,并使用 Casbin 的 Enforce 方法来检查当前用户是否有权限访问该路径。如果没有权限,则返回 HTTP 状态码 403。

现在,我们可以使用以下命令运行该应用程序:

go run main.go

现在,我们已经成功实现了基于 RBAC 的访问控制,为 HTTP 请求提供了鉴权支持。但是,我们可能希望支持请求路由参数,以便更灵活地定义访问控制策略。


  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结合 Casbin 对 http 请求做 RBAC 鉴权以及添加请求路由参数支持 的相关文章

随机推荐

  • SD-WAN设备白盒刷机

    1 启动U盘插入盒子USB接口 2 PC与盒子通过串口线连接 xff0c 波特率为115200 3 加电 4 WAN接口接入网络 xff0c 保证可以访问外网 5 cd var 6 scp 64 122 96 93 166 root Fle
  • Android手机控制ZigBee板上LED

    环境 xff1a Windows 编译器 xff1a IAREW8051 8 1 硬件 xff1a CC2530 协议栈 xff1a ZStack CC2530 2 3 0 1 4 0 手机 xff1a Android4 1 2 又重新开始
  • Windows 10 WSL2 安装Linux Xfce图形界面

    一 更新ubuntu 18 04 LTS软件源 xff0c 推荐使用国内的软件源 1 备份配置文件 xff1a cp a etc apt sources list etc apt sources list bak 2 修改sources l
  • Ubuntu终端快捷键打不开解决

    ubuntu快捷键打不开终端 问题描述 xff1a 快捷键打不开终端 xff0c 加装python3 9后 xff0c 就出现了gnome terminal报错和快捷键无法打开终端的问题 解决方法 xff1a cd usr lib pyth
  • 解决Win10 WSL2 IP地址经常变动导致docker容器无法正常访问

    前提是Win10已经安装好WSL2 xff0c 且linux发行版已经安装docker 安装wsl2host wsl2host下载地址 xff08 https github com shayne go wsl2 host releases
  • 关于BUG_ON()的一点笔记

    关于BUG ON 的一点笔记 最近在看isp1362的驱动经常看到这个BUG ON 在网上找了些相关资料 xff0c 现总结如下 先看代码吧 lt asm generic bug h gt ifndef HAVE ARCH BUG defi
  • 操作系统的各个版本和版本号对应

    内核中使用PsGetVersion 函数可以查询到当前的操作系统信息 BOOLEAN PsGetVersion PULONG MajorVersion OPTIONAL PULONG MinorVersion OPTIONAL PULONG
  • 云计算适合大专生学吗?

    云计算适合大专生学吗 xff1f 对于大专毕业生来说 xff0c 云计算的确是一个不错的选择 xff0c 因为云计算技术应用专业 xff0c 主要就是专科院校在办学 不管你是计算机相关专业的 xff0c 还是零基础想学习都是可以的 xff1
  • 收藏,最简单易懂的MapReduce使用讲解

    对于MapReduce相信大家并不陌生 xff0c 它是大数据Hadoop家族中最重要的成员之一 xff0c 是一个运行在Hadoop平台上的分布式计算框架 xff0c 对于大数据这块 xff0c 大家总是觉得高深莫测 xff0c 浅尝辄止
  • gcc-7.5.0源码安装

    由于想学习gcc 收集资料时发现了一本关于gcc源代码相关的书籍 xff0c 书中基于的版本是gcc 4 4 0 于是想重新编译一个带调试信息的版本 刚开始在ubuntu18 04上安装gcc 4 4 0时没有成功 xff0c 感觉是用系统
  • hdfs shell 操作基本语法

    hdfs用户切换并查看文件 xshell登陆到linux服务器 root 用户切换 以hdfs用户登陆查看创建的hive数据库是否以文件夹的形式存在hive文件目录下 su hdfs hdfs dfs ls apps hive wareho
  • js 多级对象数组删除对象

    let firstIndex 61 null let secondIndex 61 null const findItemNested 61 arr itemId nestingKey 61 gt arr reduce a item myI
  • Aarch64安装Anaconda Pytorch Torchvision

    1 Anaconda wget https github com Archiconda build tools releases download 0 2 3 Archiconda3 0 2 3 Linux aarch64 sh sudo
  • 扩大VMWARE里面虚拟硬盘大小(*.vmdk)

    http blog csdn net bshawk archive 2008 01 28 2070587 aspx 最近编译2 6 22的内核时 xff0c 发现虚拟机器FC6硬盘空间不够了 xff0c 于是乎 xff0c 想扩展下硬盘的大
  • c#加载xml文件

    C 加载xml文件 XmlDocument xmlDoc 61 new XmlDocument xmlDoc Load Application StartupPath 43 34 34 43 34 xml xml 34 加载xml文件 Xm
  • zram

    wiki zram是Linux内核的一个模块 xff0c 之前被称为 compcache zram通过在RAM内的压缩块设备上分页 xff0c 直到必须使用硬盘上的交换空间 xff0c 以避免在磁盘上进行分页 xff0c 从而提高性能 由于
  • 英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器

    本系列的其它几篇文章 xff1a 英飞凌 AURIX 系列单片机的HSM详解 xff08 1 xff09 何为HSM 英飞凌 AURIX 系列单片机的HSM详解 xff08 2 xff09 与HSM相关的UCB和寄存器 英飞凌 AURIX
  • MySQL数据库知识点总结

    1 什么是 MySQL MySQL 是 种关系型数据库 xff0c 在 Java 企业级开发中 常常 xff0c 因为 MySQL 是开源免费的 xff0c 并 且 便扩展 阿 巴巴数据库系统也 量 到了 MySQL xff0c 因此它的稳
  • 论文笔记-Towards Scene Understanding-Unsupervised Monocular Depth Estimation

    论文信息 标题 xff1a Towards Scene Understanding Unsupervised Monocular Depth Estimation with Semantic aware Representation作者 x
  • 结合 Casbin 对 http 请求做 RBAC 鉴权以及添加请求路由参数支持

    目录 总结 背景 实操 安装 Casbin 创建一个 Casbin 模型 创建一个 Casbin 策略 加载 Casbin 模型和策略并创建一个路由 总结 在本文中 xff0c 我们将介绍如何结合 Casbin 对 HTTP 请求进行基于角