脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Golang利用casbin实现权限验证详解

Golang利用casbin实现权限验证详解

2023-02-06 11:28爷来辣 Golang

Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。本文将利用casbin实现权限验证功能,需要的可以参考一下

导语

学习一下golang权限控制,保留一下demo代码作为参考

Casbin是什么

Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。

其功能有:

  • 支持自定义请求的格式,默认的请求格式为{subject, object, action}
  • 具有访问控制模型model和策略policy两个核心概念。
  • 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  • 支持内置的超级用户 例如:rootadministrator。超级用户可以执行任何操作而无需显式的权限声明。
  • 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

实现思路

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package main
 
import (
    "fmt"
    "github.com/casbin/casbin/v2"
    gormadapter "github.com/casbin/gorm-adapter/v3"
    _ "github.com/go-sql-driver/mysql"
)
 
func main() {
    //e, err := casbin.NewEnforcer("model.conf", "policy.csv")  // 本地policy
 
    a, _ := gormadapter.NewAdapter("mysql", "root:pass@tcp(localhost:3306)/casbin?charset=utf8mb4&parseTime=True&loc=Local", true) // 数据库policy
    e, _ := casbin.NewEnforcer("./model.conf", a)                                                                                            // model依旧放本地 没有必要放数据库 把a变成了适配器存到了数据库
 
    // Load the policy from DB.
    e.LoadPolicy()
 
    // Check the permission.
    e.Enforce("alice", "data1", "read")
 
    // Modify the policy.
    // e.AddPolicy(...)
    // e.RemovePolicy(...)
 
    // Save the policy back to DB.
    e.SavePolicy()
    sub := "alice" // 想要访问资源的用户
    obj := "data1" // 将要被访问的资源
    act := "read"  // 用户对资源实施的操作
    //added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool类型
    //fmt.Println(added)
    //fmt.Println(err)
    //if err != nil {
    //  // 处理错误
    //  fmt.Printf("%s", err)
    //}
    ok, err := e.Enforce(sub, obj, act)
 
    if err != nil {
        // 处理错误
        fmt.Printf("%s", err)
    }
 
    if ok == true {
        // 允许 alice 读取 data1
        fmt.Println("通过")
    } else {
        // 拒绝请求,抛出异常
        fmt.Println("未通过")
    }
 
    // 您可以使用 BatchEnforce() 去批量处理一些请求。
    // 这个方法返回一个布尔类型的切片,切片的下标对应二位数组的行标
    // 例如 results[0] 是 {"alice", "data1", "read"} 的结果
    //results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
}

Golang利用casbin实现权限验证详解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package main
 
import (
    "fmt"
    "github.com/casbin/casbin/v2"
    gormadapter "github.com/casbin/gorm-adapter/v3"
    _ "github.com/go-sql-driver/mysql"
)
 
func main() {
    //e, err := casbin.NewEnforcer("model.conf", "policy.csv")  // 本地policy
 
    a, _ := gormadapter.NewAdapter("mysql", "root:pass@tcp(localhost:3306)/casbin?charset=utf8mb4&parseTime=True&loc=Local", true) // 数据库policy
    e, _ := casbin.NewEnforcer("./model.conf", a)                                                                                            // model依旧放本地 没有必要放数据库 把a变成了适配器存到了数据库
 
    // Load the policy from DB.
    e.LoadPolicy()
 
    // Check the permission.
    e.Enforce("alice", "data1", "read")
 
    // Modify the policy.
    // e.AddPolicy(...)
    // e.RemovePolicy(...)
 
    // Save the policy back to DB.
    e.SavePolicy()
    sub := "alice" // 想要访问资源的用户
    obj := "data1" // 将要被访问的资源
    act := "read"  // 用户对资源实施的操作
    added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool类型
    fmt.Println(added)
 
    if err != nil {
        // 处理错误
        fmt.Printf("%s", err)
    }
    ok, err := e.Enforce(sub, obj, act)
 
    if err != nil {
        // 处理错误
        fmt.Printf("%s", err)
    }
 
    if ok == true {
        // 允许 alice 读取 data1
        fmt.Println("通过")
    } else {
        // 拒绝请求,抛出异常
        fmt.Println("未通过")
    }
 
    // 您可以使用 BatchEnforce() 去批量处理一些请求。
    // 这个方法返回一个布尔类型的切片,切片的下标对应二位数组的行标
    // 例如 results[0] 是 {"alice", "data1", "read"} 的结果
    //results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
}

Golang利用casbin实现权限验证详解

Golang利用casbin实现权限验证详解

到此这篇关于Golang利用casbin实现权限验证详解的文章就介绍到这了,更多相关Golang casbin权限验证内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/xujiamin0022016/article/details/128071277

延伸 · 阅读

精彩推荐
  • Golanggolang 设置web请求状态码操作

    golang 设置web请求状态码操作

    这篇文章主要介绍了golang 设置web请求状态码操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    一名路过的小码农10582021-02-25
  • GolangGo框架三件套Gorm Kitex Hertz基本用法与常见API讲解

    Go框架三件套Gorm Kitex Hertz基本用法与常见API讲解

    这篇文章主要为大家介绍了Go框架三件套Gorm Kitex Hertz的基本用法与常见API讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日...

    啵啵肠6522023-02-07
  • GolangGolang高性能持久化解决方案BoltDB数据库介绍

    Golang高性能持久化解决方案BoltDB数据库介绍

    这篇文章主要为大家介绍了Golang高性能持久化解决方案BoltDB数据库介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...

    梦想画家6962021-12-05
  • GolangGo处理PDF的实现代码

    Go处理PDF的实现代码

    这篇文章主要介绍了Go处理PDF的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小...

    poisoner10532020-06-02
  • Golanggolang的time包:秒、毫秒、纳秒时间戳输出方式

    golang的time包:秒、毫秒、纳秒时间戳输出方式

    这篇文章主要介绍了golang的time包:秒、毫秒、纳秒时间戳输出方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    oOMirageOo23182021-03-01
  • Golanggolang gin框架获取参数的操作

    golang gin框架获取参数的操作

    这篇文章主要介绍了golang gin框架获取参数的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    疯狂的鸭血17952021-03-14
  • Golang自定义Go Json的序列化方法译文

    自定义Go Json的序列化方法译文

    这篇文章主要为大家介绍了自定义Go Json序列化方法译文,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    Ilia Choly8942022-10-23
  • Golang利用Go语言快速实现一个极简任务调度系统

    利用Go语言快速实现一个极简任务调度系统

    任务调度(Task Scheduling)是很多软件系统中的重要组成部分,字面上的意思是按照一定要求分配运行一些通常时间较长的脚本或程序。本文将利用Go语言快...

    MarvinZhang11192022-11-24