Golang之casbin权限管理的实现
作者:HaimaBlog 发布时间:2024-05-09 14:54:28
1. 权限管理
Casbin是用于Golang项目的功能强大且高效的开源访问控制库。
1.1.1. 特征
Casbin的作用:
以经典{subject, object, action}形式或您定义的自定义形式实施策略,同时支持允许和拒绝授权。
处理访问控制模型及其策略的存储。
管理角色用户映射和角色角色映射(RBAC中的角色层次结构)。
支持内置的超级用户,例如root或administrator。超级用户可以在没有显式权限的情况下执行任何操作。
多个内置运算符支持规则匹配。例如,keyMatch可以将资源键映射/foo/bar到模式/foo*。
Casbin不执行的操作:
身份验证(又名验证username以及password用户登录时)
管理用户或角色列表。我相信项目本身管理这些实体会更方便。用户通常具有其密码,而Casbin并非设计为密码容器。但是,Casbin存储RBAC方案的用户角色映射。
1.1.2. 怎么运行的
在Casbin中,基于PERM元模型(策略,效果,请求,匹配器)将访问控制模型抽象为CONF文件。因此,切换或升级项目的授权机制就像修改配置一样简单。您可以通过组合可用的模型来定制自己的访问控制模型。例如,您可以在一个模型中同时获得RBAC角色和ABAC属性,并共享一组策略规则。
Casbin中最基本,最简单的模型是ACL。ACL的CONF模型为:
#请求定义
[request_definition]
r = sub,obj,act
#策略定义
[policy_definition]
p = sub,obj,act
#政策效果
[policy_effect]
e = some(其中( p.eft ==允许))
#匹配器
[匹配器]
米 = r.sub == p.sub && r.obj == p.obj && r.act == p.act
ACL模型的示例策略如下:
p, alice, data1, read
p, bob, data2, write
1.1.3. 安装
go get github.com/casbin/casbin
1.1.4. 示例代码
package main
import (
"fmt"
"log"
"github.com/casbin/casbin"
xormadapter "github.com/casbin/xorm-adapter"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// 要使用自己定义的数据库rbac_db,最后的true很重要.默认为false,使用缺省的数据库名casbin,不存在则创建
a, err := xormadapter.NewAdapter("mysql", "root:root@tcp(127.0.0.1:3306)/goblog?charset=utf8", true)
if err != nil {
log.Printf("连接数据库错误: %v", err)
return
}
e, err := casbin.NewEnforcer("./rbac_models.conf", a)
if err != nil {
log.Printf("初始化casbin错误: %v", err)
return
}
//从DB加载策略
e.LoadPolicy()
//获取router路由对象
r := gin.New()
r.POST("/api/v1/add", func(c *gin.Context) {
fmt.Println("增加Policy")
if ok, _ := e.AddPolicy("admin", "/api/v1/hello", "GET"); !ok {
fmt.Println("Policy已经存在")
} else {
fmt.Println("增加成功")
}
})
//删除policy
r.DELETE("/api/v1/delete", func(c *gin.Context) {
fmt.Println("删除Policy")
if ok, _ := e.RemovePolicy("admin", "/api/v1/hello", "GET"); !ok {
fmt.Println("Policy不存在")
} else {
fmt.Println("删除成功")
}
})
//获取policy
r.GET("/api/v1/get", func(c *gin.Context) {
fmt.Println("查看policy")
list := e.GetPolicy()
for _, vlist := range list {
for _, v := range vlist {
fmt.Printf("value: %s, ", v)
}
}
})
//使用自定义 * 中间件
r.Use(Authorize(e))
//创建请求
r.GET("/api/v1/hello", func(c *gin.Context) {
fmt.Println("Hello 接收到GET请求..")
})
r.Run(":9000") //参数为空 默认监听8080端口
}
// *
func Authorize(e *casbin.Enforcer) gin.HandlerFunc {
return func(c *gin.Context) {
//获取请求的URI
obj := c.Request.URL.RequestURI()
//获取请求方法
act := c.Request.Method
//获取用户的角色
sub := "admin"
//判断策略中是否存在
if ok, _ := e.Enforce(sub, obj, act); ok {
fmt.Println("恭喜您,权限验证通过")
c.Next()
} else {
fmt.Println("很遗憾,权限验证没有通过")
c.Abort()
}
}
}
rbac_models.conf里面的内容如下:
[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
配置链接数据库不需要手动创建数据库,系统自动创建casbin_rule表
使用postman请求http://localhost:9000/api/v1/hello
运行解决结果显示为很遗憾,权限验证没有通过
下面我在数据表中添加数据在演示的时候可以直接手动按照图片的格式直接添加数据表,或者使用postman POST方式请求http://localhost:9000/api/v1/add
然后继续请求http://localhost:9000/api/v1/hello
原文地址:
http://www.topgoer.com/gin框架/其他/权限管理.html
来源:http://www.topgoer.com/gin%E6%A1%86%E6%9E%B6/%E5%85%B6%E4%BB%96/%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.html


猜你喜欢
- 如何下载:我先去MySQL首页下载最新版本的MySQL-链接:https://www.mysql.com/downloads/进入此界面下载
- 如下所示:# 返回一个列表中出现次数最多的元素def showmax(lt): index1 = 0&n
- 问题你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列解决方案最简单的过滤序列元素的方法就是使用列表推导。比如:>>
- 前段时间开始学习JSON在ASP中的使用,JSON确实比XML方便。以前在写程序的时候有考虑使用XML来存储数据,但是一直觉得生成文档及文档
- Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱
- 上个月,我写了一篇关于微软如何在向jQuery贡献代码的文章,也谈到了在第一批贡献的代码中的一些功能:jQuery模板和数据链接支持.今天,
- 前两天有一位网友问我一个关于Javascript中++操作符的问题,他的代码大致是这样的ADS.addEvent(window,'c
- 例子:#!/bin/perlprint "Please input an string and a number by order
- 这是一个通过js实现的支付后的页面,点击支付会跳出一个弹窗,提示你是否要确定支付,确定后进入付后界面,该页面有着10秒倒计时,计时结束后便会
- 在使用数据库的时候,难免要在使用过程中进行删除的操作,如果是使用int类型的字段,令其自增长,这是个最简单的办法,但是后果会有些不是你想要的
- 类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。一、绑定方法1 对象的绑定方法
- 本文实例讲述了mysql多个left join连接查询用法。分享给大家供大家参考,具体如下:mysql查询时需要连接多个表时,比如查询订单的
- 在准备学习python的PyQt5库时会遇到pyqt5-tools安装失败的情况。其中一种可能是版本不适配。Pycharm弹出显示:安装软件
- 前言本文介绍CentOS7使用yum安装golang一、go语言介绍Go语言 是Google公司 在2007开发一种静态强类型、编译型语言,
- 下载IDEA、PyCharm、PhpStorm免费激活码本次更新:2020年11月13 (定期更新)推荐教程:IntelliJ IDEA 2
- 数据类型:定义列中可以存储什么数据以及该数据实际怎样存储的基本规则。数据类型用于以下目的:1、允许限制可存储在列中的数据。如:数值数据类型列
- 一、问题本人在使用layui使用了select按钮,点击是js脚本会异步请求后台接口获取json数据,然后layui将json数据渲染到se
- 本文实例讲述了python使用xmlrpclib模块实现对百度google的ping功能。分享给大家供大家参考。具体分析如下:最近在做SEO
- 1创建窗口1 turtle.setup(width,height,startx,starty)设置主窗口的大小和位置,width如果是整数,
- 如果按本文操作遇到一些问题报错,如C:\Users\milyyy\AppData\Roaming\npm-cache\_logs\2018-