gin框架学习-Casbin进阶之策略管理API使用方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载。

前言


感谢开源项目gin-vue-admin,以及1010工作室的视频教程

本人学识尚浅,如有错误,请评论指出,谢谢!

详细可见个人博客:https://linzyblog.netlify.app/

一、Casbin 安装


1、安装


go get github.com/casbin/casbin/v2


2、在线编辑


您还可以使用在线编辑器 ( https://casbin.org/editor/ ) 在 Web 浏览器中编写您的 Casbin 模型和策略。


二、创建Casbin enforcer


Casbin使用配置文件来设置访问控制模式。


它有两个配置文件,model.conf和policy.csv。 其中,model.conf存储了访问模型,policy.csv存储了特定的用户权限配置。 Casbin的使用非常精炼。 基本上,我们只需要一个主要结构:enforcer。 当构建这个结构时,model.conf和policy.csv将被加载。


换句话说,要新建一个Casbin enforcer,你必须提供一个Model和一个Adapter。


1、Model.conf


Model规定了权限由 sub、obj、act三要素组成,只有在策略Policy列表中存在于请求Request完全相同的策略时,该请求才能通过。匹配器的结构通过 p.eft 获取, some(where (p.eft == allow)) 表示有任意一条 policy rule 满足, 则最终结果为 allow


# 请求
# sub ——> 想要访问资源的用户角色(Subject)——请求实体
# obj ——> 访问的资源(Object)
# act ——> 访问的方法(Action: get、post...)
[request_definition]
r = sub,obj,act
# 策略(.csv文件p的格式,定义的每一行为policy rule;p为policy rule的名字。)
[policy_definition]
p = sub,obj,act
# 策略效果
[policy_effect]
e = some(where (p.eft == allow))
# 上面表示有任意一条 policy rule 满足, 则最终结果为 allow;p.eft它可以是allow或deny,它是可选的,默认是allow
# 匹配器
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act


2、Policy.csv


Policy表示谁能对什么资源进行什么操作


p, linzy, data1, read
p, hhh, data2, write


linzy 对 资源 data1 有 read 权限

hhh 对 资源 data2 有 write 权限


3、创建enforcer


1)创建


NewEnforcer通过文件或DB创建一个enforcer


//使用Model文件和默认 FileAdapter
e := casbin.NewEnforcer("./test/model.conf", "./test/policy.csv")


2)检查权限


Enforce决定一个“subject”是否可以通过操作“action”访问一个“object”,输入参数通常是:(sub, obj, act)


  sub := "linzy" // 需要访问资源的用户。
  obj := "data1" // 将要被访问的资源。
  act := "read"  // 用户对资源的权限。
  //Enforce决定一个“subject”是否可以通过操作“action”访问一个“object”,输入参数通常是:(sub, obj, act)
  b := e.Enforce(sub, obj, act)
  if b {
    // 允许 linzy 读取 data 1
    fmt.Println("通过")
  } else {
    // 拒绝请求,显示错误
    fmt.Println("未通过")
  }

669c5e2931aa4d1eb5f1ac35a222ceb4.png


三、策略管理操作


1、查询所有授权规则


GetPolicy 获取策略中的所有授权规则。


  //GetPolicy获取策略中的所有授权规则。
  policy := e.GetPolicy()
  fmt.Println(policy)

bb6b382b908f42b187292e1135ca4bc8.png


2、查询是否存在授权规则


HasPolicy 确定是否存在授权规则。


  //HasPolicy 确定是否存在授权规则。
  hasPolicy := e.HasPolicy("linzy", "data1", "read")
  fmt.Println(hasPolicy)
  hasPolicy = e.HasPolicy("hhh", "data1", "read")
  fmt.Println(hasPolicy)

f80fe7a801e04cbca173ec6d075c8b5a.png


3、添加授权规则


AddPolicy 向当前策略添加授权规则。 如果规则已经存在,函数返回false,并且不会添加规则。 否则,函数通过添加新规则并返回true。


  policy := e.GetPolicy()
  fmt.Println(policy)
  //AddPolicy为当前策略添加一条授权规则。
  //如果规则已经存在,函数返回false,规则不会被添加。
  //否则函数通过添加新规则返回true。
  added := e.AddPolicy("alice", "data3", "read")
  fmt.Println(added)
  policy = e.GetPolicy()
  fmt.Println(policy)

8a7931f2a7b64e93b53312c952cd6eda.png


4、删除授权规则


RemovePolicy 从当前策略中删除授权规则。


  policy = e.GetPolicy()
  fmt.Println(policy)
  //RemovePolicy 从当前策略中删除授权规则。
  removed := e.RemovePolicy("alice", "data1", "read")
  fmt.Println(removed)
  policy = e.GetPolicy()
  fmt.Println(policy)

86921f2d4e644bbb8c70d86cd4c65089.png


5、修改授权规则


UpdatePolicy 把旧的政策更新到新的政策


  //UpdatePolicy 把旧的政策更新到新的政策
  updated, err := e.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})


四、MySQL数据库搭配Model文件


1、创建SQLAdapter


我这里使用的是MySQL


import (
  "fmt"
  "log"
  //一定要选择casbin的v2版本 不然会报错
  "github.com/casbin/casbin/v2"
  xormadapter "github.com/casbin/xorm-adapter/v2"
  _ "github.com/go-sql-driver/mysql"
)
func main() {
  // NewAdapter是Adapter的构造函数
  // dbSpecified为可选bool参数。默认值为false。
  //这取决于您是否在dataSourceName中指定了一个现有的DB。
  //如果dbSpecified == true,您需要确保dataSourceName中的DB存在。
  //如果dbSpecified == false,适配器将自动创建名为"casbin"的数据库。
  a, err := xormadapter.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/go_test", true)
  fmt.Println(a, err)
  //NewEnforcer通过DB创建一个enforcer
  e, err := casbin.NewEnforcer("./test/model.conf", a)
  if err != nil {
    log.Fatalf("error: enforcer: %s", err)
  }
}


当前自动创建了"casbin_rule"的数据表,且数据表为空


393cbe21584a46ce9529c4ebc8808990.png


2、添加单条授权规则


AddPolicy 向当前策略添加授权规则。 如果规则已经存在,函数返回false,并且不会添加规则。 否则,函数通过添加新规则并返回true。


  added, _ := e.AddPolicy("linzy", "data1", "read")
  fmt.Println(added)

d0f0d3b667024dc3b9e5832390d26ae7.png


3、添加多条授权规则


AddPolicy 向当前策略添加授权规则。 该操作本质上是原子的 因此,如果授权规则由不符合现行政策的规则组成, 函数返回false,当前政策中没有添加任何政策规则。 如果所有授权规则都符合政策规则,则函数返回true,每项政策规则都被添加到目前的政策中。


  rules := [][]string{
    {"jack", "data4", "read"},
    {"katy", "data4", "write"},
    {"leyo", "data4", "read"},
    {"ham", "data4", "write"},
  }
  areRulesAdded, _ := e.AddPolicies(rules)
  fmt.Println(areRulesAdded)

25cbd8b6450440e8b379b8c2a36563c3.png


4、删除授权规则


RemovePolicy 从当前策略中删除授权规则。


  removed, _ := e.RemovePolicy("leyo", "data4", "read")
  fmt.Println(removed)

f947871a051743c792a7f16141906a32.png


5、修改授权规则


UpdatePolicy 把旧的政策更新到新的政策


  updated, _ := e.UpdatePolicy([]string{"jack", "data4", "read"}, []string{"linzy", "data3", "write"})
  fmt.Println(updated)

0477b550cbd9424995c64e7078f2ca8c.png


6、查询所有授权规则


GetPolicy 获取策略中的所有授权规则。


  s := e.GetPolicy()
  fmt.Println(s)

28aa9ab33b4548dea642700339054950.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
API
用 Koa 框架实现一个简单的 RESTful API
用 Koa 框架实现一个简单的 RESTful API
|
13天前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
99 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
65 4
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
189 3
|
8天前
|
人工智能 数据可视化 API
自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践
本文介绍了使用HarmonyOS的Calendar Kit开发日程管理应用的过程。通过API 13版本,不仅实现了创建、查询、更新和删除日程等基础功能,还深入探索了权限请求、日历配置、事件添加及查询筛选等功能。实战项目中,开发了一个智能日程管理工具,具备可视化管理、模糊查询和智能提醒等特性。最终,作者总结了模块化开发的优势,并展望了未来加入语音助手和AI推荐功能的计划。
121 1
|
2月前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
32 2
|
2月前
|
JSON JavaScript 中间件
Koa框架下的RESTful API设计与实现
在现代 Web 开发中,构建高效、可维护的 API 是至关重要的。Koa 是一个流行的 Node.js Web 应用框架,它具有简洁、灵活和强大的特性,非常适合用于设计和实现 RESTful API。
|
2月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
74 2
|
2月前
|
API PHP 数据库
PHP中哪个框架最适合做API?
在数字化时代,API作为软件应用间通信的桥梁至关重要。本文探讨了PHP中适合API开发的主流框架,包括Laravel、Symfony、Lumen、Slim、Yii和Phalcon,分析了它们的特点和优势,帮助开发者选择合适的框架,提高开发效率、保证接口稳定性和安全性。
81 3
|
2月前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
66 4