网站建设福永附近网络公司,建设营销网站的四个步骤,html网站简易模板,遵义市城乡建设局安管人员考试网站1. 核心概念 核心配置中含两部分模型配置以及策略配置#xff0c;给出两个示范配置#xff0c;在此基础上对实际请求进行分析。 1.1 Model 模型文件#xff0c;存储了请求定义(request_definition)#xff0c;策略定义(policy_definition)#xff0c;匹配规则(matchers)给出两个示范配置在此基础上对实际请求进行分析。 1.1 Model 模型文件存储了请求定义(request_definition)策略定义(policy_definition)匹配规则(matchers)以及匹配的综合结果(policy_effect) [request_definition]
r sub, obj, act[policy_definition]
p sub, obj, act[policy_effect]
e some(where (p.eft allow))[matchers]
m r.sub p.sub r.obj p.obj r.act p.act1.2 Policy 以下为示策略文件policy.csv含有两条策略策略除了存储在文件中还可以保存到数据库后续中我们用到GORM Adapter保存到数据库中 p,leo,/api/user,GET
p,leo,/api/user,POST1.3 实例分析 以用户leo通过GET方法访问后台API:/api/user为例 #mermaid-svg-a6RMBmedYEiTXOHK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-a6RMBmedYEiTXOHK .error-icon{fill:#552222;}#mermaid-svg-a6RMBmedYEiTXOHK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-a6RMBmedYEiTXOHK .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-a6RMBmedYEiTXOHK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-a6RMBmedYEiTXOHK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-a6RMBmedYEiTXOHK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-a6RMBmedYEiTXOHK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-a6RMBmedYEiTXOHK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-a6RMBmedYEiTXOHK .marker.cross{stroke:#333333;}#mermaid-svg-a6RMBmedYEiTXOHK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-a6RMBmedYEiTXOHK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-a6RMBmedYEiTXOHK .cluster-label text{fill:#333;}#mermaid-svg-a6RMBmedYEiTXOHK .cluster-label span{color:#333;}#mermaid-svg-a6RMBmedYEiTXOHK .label text,#mermaid-svg-a6RMBmedYEiTXOHK span{fill:#333;color:#333;}#mermaid-svg-a6RMBmedYEiTXOHK .node rect,#mermaid-svg-a6RMBmedYEiTXOHK .node circle,#mermaid-svg-a6RMBmedYEiTXOHK .node ellipse,#mermaid-svg-a6RMBmedYEiTXOHK .node polygon,#mermaid-svg-a6RMBmedYEiTXOHK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-a6RMBmedYEiTXOHK .node .label{text-align:center;}#mermaid-svg-a6RMBmedYEiTXOHK .node.clickable{cursor:pointer;}#mermaid-svg-a6RMBmedYEiTXOHK .arrowheadPath{fill:#333333;}#mermaid-svg-a6RMBmedYEiTXOHK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-a6RMBmedYEiTXOHK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-a6RMBmedYEiTXOHK .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-a6RMBmedYEiTXOHK .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-a6RMBmedYEiTXOHK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-a6RMBmedYEiTXOHK .cluster text{fill:#333;}#mermaid-svg-a6RMBmedYEiTXOHK .cluster span{color:#333;}#mermaid-svg-a6RMBmedYEiTXOHK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-a6RMBmedYEiTXOHK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 根据request_definition对应request中三个参数为 matchers根据条件匹配策略匹配返回true matchers根据条件匹配策略不匹配的忽略 matchers根据条件匹配策略不匹配的忽略 policy_effect计算影响,some(where (p.eft allow))表示其中一条匹配即通过 用户leo通过GET方法访问/api/user (leo, /api/user, GET)-(r.sub, r.obj, r.act) 匹配策略1 匹配策略2 匹配策略.... 返回最终结果通过或者拒绝 1.3 ACL模型和RBAC模型 Casbin模型比较多只需理解以下两种模型基本能满足绝大部分业务需求 1.3.1 ACL模型 简单理解如上面model.conf中不包含用户角色组策略中都是针对单个用户用户的请求和动作直接匹配策略并计算结果 1.3.2 RBAC模型 简单理解用户关联到角色组策略定义中针对组做策略 后续gin casbin鉴权中选用该模型 后续示例中model.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后续示例中policy.csv 定义了两条策略admin组能访问的资源以及操作以及用户leo属于admin组 p,admin,/api/user,GET
p,admin,/api/user,POSTg,leo,admin2. 库使用
2.1 Enforcer 执行器概念 Casbin 库中核心概念为执行器Enforcer 使用casbin.NewEnforcer(./model.conf, ./policy.csv)加载模型和策略 调用Enforcer的Enforce(r.sub, r.obj, r.act)方法检查鉴权结果 package mainimport (fmtgithub.com/casbin/casbin/v2
)func CheckPermission(e *casbin.Enforcer, sub, obj, act string) {ok, err : e.Enforce(sub, obj, act)if err ! nil {panic(check enforce error: err.Error())}if ok {fmt.Printf(用户: %s 访问资源: %s 使用方法: %s 检查通过\n, sub, obj, act)} else {fmt.Printf(用户: %s 访问资源: %s 使用方法: %s 检查拒绝\n, sub, obj, act)}
}func main() {enforcer, err : casbin.NewEnforcer(./model.conf, ./policy.csv)if err ! nil {panic(new enforcer error: err.Error())}// 预期输出:// 用户: leo 访问资源: /api/user 使用方法: GET 检查通过CheckPermission(enforcer, leo, /api/user, GET)// 预期输出:// 用户: leo 访问资源: /api/user 使用方法: DELETE 检查拒绝CheckPermission(enforcer, leo, /api/user, DELETE)
}
2.2 adapter 适配器概念 casbin.NewEnforcer(“./model.conf”, “./policy.csv”)中默认从文件加载是内置的名为File Adapter (内置)实现的 后续中我们需将权限存储到DB中使用的适配器为GORM Adapter使用如下: package mainimport (loggithub.com/casbin/casbin/v2gormadapter github.com/casbin/gorm-adapter/v3github.com/glebarez/sqlitegorm.io/gorm
)func main() {db, err : gorm.Open(sqlite.Open(test.db), gorm.Config{})if err ! nil {panic(failed to connect database)}a, err : gormadapter.NewAdapterByDB(db)if err ! nil {panic(new gorm adapter error: err.Error())}e, err : casbin.NewEnforcer(./model.conf, a)if err ! nil {panic(new casbin enforcer error: err.Error())}e.LoadPolicy()// 添加策略ok, err : e.AddPolicy(admin, /api/user, GET)log.Println(add admin /api/user GET: , ok, err)ok, err e.AddGroupingPolicy(leo, admin)log.Println(add leo to admin group: , ok, err)e.SavePolicy()ok, err e.Enforce(leo, /api/user, GET)log.Println(leo GET /api/user :, ok, err)ok, err e.Enforce(leo, /api/user, DELETE)log.Println(leo DELETE /api/user :, ok, err)
}测试结果 2.3 Functions(Matchers中的函数) 上述model.conf中有一个问题访问的url是/api/user/123形式r.obj与p.obj不匹配这时候我们要用到Matchers中的函数,一般选择keyMatch2即可能针对url能满足日常需求 修改后的model.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 r.sub p.sub keyMatch2(r.obj,p.obj) r.act p.act更多函数参考https://casbin.org/zh/docs/function 函数url模式keyMatch一个URL 路径例如/alice_data/resource1一个URL 路径或*模式下例如/alice_data/*keyMatch2一个URL 路径例如/alice_data/resource1一个URL 路径或:模式下例如/alice_data/:resourcekeyMatch3一个URL 路径例如/alice_data/resource1一个URL 路径或{}模式下例如/alice_data/{resource}keyMatch4一个URL 路径例如/alice_data/resource1一个URL 路径或{}模式下例如/alice_data//{id}/book/{id}keyMatch5a URL path like/alice_data/123/?status1a URL path, a{}or*pattern like/alice_data/{id}/*regexMatch任意字符串正则表达式模式
3. 结语 至此已了解的概念已能满足业务需求下一章将Casbin与Gorm结合起来并实现增删改查功能