-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcasbin.go
99 lines (84 loc) · 2.06 KB
/
casbin.go
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package echox
import (
"strconv"
"github.com/casbin/casbin/v2"
"github.com/goexl/gox"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
)
var methodMapping = map[string]string{
"GET": "r",
"POST": "c",
"PUT": "u",
"DELETE": "d",
"*": "*",
}
type Casbin struct {
// 确定是不是要走中间件
skipper middleware.Skipper
// Casbin的权限验证模块
enforcer *casbin.Enforcer
// Jwt的配置
jwt Jwt
// 是否包含尾部斜杠
trailingSlash bool
// 用户角色权限
source roleSource
}
// NewCasbin Casbin权限验证
func NewCasbin(enforcer *casbin.Enforcer, jwt Jwt, source roleSource) *Casbin {
return NewCasbinWithConfig(middleware.DefaultSkipper, enforcer, jwt, false, source)
}
// NewCasbinWithConfig Casbin权限验证
func NewCasbinWithConfig(
skipper middleware.Skipper,
enforcer *casbin.Enforcer,
jwt Jwt,
trailingSlash bool,
source roleSource,
) *Casbin {
return &Casbin{
skipper: skipper,
enforcer: enforcer,
jwt: jwt,
trailingSlash: trailingSlash,
source: source,
}
}
func (c *Casbin) checkPermission(ctx echo.Context) (pass bool, err error) {
var (
user gox.BaseUser
roleIds []int64
)
if err = c.jwt.Subject(&Context{Context: ctx}, user); nil != err {
return
}
if roleIds, err = c.source.GetsRoleId(user.Id); nil != err {
return
}
path := ctx.Request().URL.Path
if pass, err = c.checkCasbinPermission(path, methodMapping[ctx.Request().Method], roleIds...); nil != err {
return
}
// 取得Path
// 统一加上最后的斜杠
if !pass && c.trailingSlash {
path += "/"
pass, err = c.checkCasbinPermission(path, methodMapping[ctx.Request().Method], roleIds...)
}
return
}
func (c *Casbin) checkCasbinPermission(obj string, act string, roleIds ...int64) (pass bool, err error) {
for _, roleId := range roleIds {
roleIdStr := strconv.FormatInt(roleId, 10)
// 调用Casbin检查权限
if pass, err = c.enforcer.Enforce(roleIdStr, obj, act); nil != err {
break
}
// 已经有权限,提前结束
if pass {
break
}
}
return
}