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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2月前
|
人工智能 搜索推荐 算法
唯品会 API 开启唯品会店铺精准营销新策略
在竞争激烈的电商市场中,唯品会作为领先的折扣平台,通过API技术助力商家实现精准营销。API为商家提供用户行为、商品与交易数据,支撑用户画像、个性化推荐、动态定价、跨渠道营销与库存预测等策略,提升转化率与用户忠诚度,推动销售增长与营销智能化升级。
140 1
|
4月前
|
算法 搜索推荐 API
API让电商“活”起来:动态定价策略的革新力量
在电商竞争中,动态定价策略通过API实时调整价格,响应市场变化,提升利润与竞争力。本文解析其原理、技术实现与应用,探讨API如何重塑电商生态。
274 1
|
5月前
|
人工智能 监控 Cloud Native
深度剖析电商API监控与报警:守护电商系统稳定的核心策略
电商API监控与报警是保障电商业务稳定运行的关键工具。文章从重要性、关键指标(如响应时间、成功率、错误率等)、技术工具(如日志监控、性能监控、异常检测)及实施步骤等方面详细阐述了如何构建高效的监控体系。通过案例分析,如京东的商品API实战,展示了全链路追踪与智能告警的应用价值。未来,随着AI、自动化和云原生技术的发展,电商API监控将更加智能高效,助力提升用户体验与业务效率。
|
4月前
|
自然语言处理 供应链 前端开发
深度解析与技术实践:高效调用淘宝商品评论API的策略与代码实现
本文深入解析淘宝开放平台商品评论接口(Taobao.item_review),涵盖接口功能、调用逻辑与实战代码,助力开发者高效获取用户评价数据,提升电商数据分析能力。
|
2月前
|
存储 监控 前端开发
淘宝商品详情 API 实战:5 大策略提升店铺转化率(附签名优化代码 + 避坑指南)
本文深入解析淘宝商品详情API的核心字段与实战应用,分享如何通过动态定价、库存预警、差评控制等5大策略提升电商转化率。结合300+店铺实战经验,提供优化代码与避坑指南,助力开发者与运营者实现数据驱动的精细化运营。
|
2月前
|
数据采集 监控 API
亚马逊:对接竞品监控API实时跟踪价格变动,调整定价策略
在电商竞争中,亚马逊通过对接竞品监控API,实现价格实时采集与分析,动态调整定价策略。本文详解其技术实现、商业价值及挑战,展现数据驱动下的智能定价如何提升竞争力与利润。
358 0
|
2月前
|
人工智能 算法 搜索推荐
拼多多:通过用户分组API实施差异化营销策略,提高客单价
拼多多通过用户分组API实现差异化营销,精准提升客单价。基于用户行为数据自动分类,针对不同群体推送专属优惠,如高频用户推高端商品、新用户送礼包、低频用户唤醒激励。结合满减、捆绑销售等策略,有效提高单笔订单金额。该策略提升营销效率,增强用户粘性,助力平台实现数据驱动的可持续增长。
201 0
|
2月前
|
供应链 算法 API
网易严选 API 助力,品质电商商品选品策略升级
在电商竞争激烈背景下,网易严选通过开放商品数据API,提供动态选品解决方案,助力合作伙伴精准决策,实现效率与品质双提升,推动电商战略升级。
90 0
|
2月前
|
数据采集 JSON 监控
利用唯品会 API 接口,实现唯品会店铺商品折扣策略精准制定
在电商竞争激烈的背景下,唯品会店铺如何通过API接口实现商品精准折扣策略成为关键。本文结合数学模型与Python代码,系统讲解从数据获取、模型构建到策略实施的全流程,助力提升利润与运营效率。
75 0
|
3月前
|
供应链 搜索推荐 API
苏宁易购 API 助力,苏宁易购平台 3C 产品销售策略优化
在电商竞争激烈的环境下,苏宁易购通过API优化3C产品销售策略,实现数据驱动决策、个性化推荐与智能库存管理,提升销售额与运营效率,增强用户体验,巩固市场竞争力。
121 0