这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
1 介绍
grbac是一种RBAC框架。它支持增强的通配符并使用Radix树匹配HTTP请求,适用目前所
有的数据库和数据结构。
grbac的作用是确保指定的资源只能由指定的角色访问。但是grbac不负责储存鉴权规则和分辨“发起请求的IP具有那些角色”,所以需要自己配置规则信息并给每一个请求的发起者提供相关的角色。
首先获取依赖:
go get -u github.com/storyicon/grbac
//常与gin框架连用
go get -u github.com/gin-gonic/gin
2 概念
2.1 Resource类
type Resource struct {
// Host 定义资源的Host,允许使用增强的通配符。
Host string `json:"host"`
// Path 定义资源的Path,允许使用增强的通配符。
Path string `json:"path"`
// Method 定义资源的Method,允许使用增强的通配符。
Method string `json:"method"`
}
2.2 Permission类
// Permission用于定义权限控制信息
type Permission struct {
// AuthorizedRoles定义允许访问资源的角色
// 支持的类型: 非空字符串,*
// *: 意味着任何角色,但访问者应该至少有一个角色,
// 非空字符串:指定的角色
AuthorizedRoles []string `json:"authorized_roles"`
// ForbiddenRoles 定义不允许访问指定资源的角色
// ForbiddenRoles 优先级高于AuthorizedRoles
// 支持的类型:非空字符串,*
// *: 意味着任何角色,但访问者应该至少有一个角色,
// 非空字符串:指定的角色
//
ForbiddenRoles []string `json:"forbidden_roles"`
// AllowAnyone的优先级高于 ForbiddenRoles、AuthorizedRoles
// 如果设置为true,任何人都可以通过验证。
// 请注意,这将包括“没有角色的人”。
AllowAnyone bool `json:"allow_anyone"`
}
2.3 Rule类
// Rule即规则,用于定义Resource和Permission之间的关系
type Rule struct {
// ID决定了Rule的优先级。
// ID值越大意味着Rule的优先级越高。
// 当请求被多个规则同时匹配时,grbac将仅使用具有最高ID值的规则。
// 如果有多个规则同时具有最大的ID,则将随机使用其中一个规则。(不建议)
ID int `json:"id"`
*Resource
*Permission
}
2.3 Loader
Loader用于加载Rule,支持使用func()(grbac.Rules, error) 自定义加载器并通过grbac.WithLoader加载它。
| method | description |
|---|---|
| WithJSON(path, interval) | 定期从json文件加载规则配置 |
| WithYaml(path, interval) | 定期从yaml文件加载规则配置 |
| WithRules(Rules) | 从grbac.Rules加载规则配置 |
| WithAdvancedRules(loader.AdvancedRules) | 以一种更紧凑的方式定义Rule,并加载 |
| WitheLoader(loader func()(Rules, error), interval) | 使用自定义函数加载定义的规则 |
其中的interval定义的是Rules的重载周期。若其小于0,则不加载;若其大于等于0且小于1时,interval默认设置为5秒。