|
|
hace 1 semana | |
|---|---|---|
| example | hace 1 semana | |
| pb | hace 1 semana | |
| README.md | hace 1 semana | |
| cache.go | hace 1 semana | |
| client.go | hace 1 semana | |
| collector.go | hace 1 semana | |
| config.go | hace 1 semana | |
| context.go | hace 1 semana | |
| fieldperm.go | hace 1 semana | |
| go.mod | hace 1 semana | |
| go.sum | hace 1 semana | |
| middleware.go | hace 1 semana | |
| permlib.go | hace 1 semana | |
| sync.go | hace 1 semana |
Go 权限系统接入 SDK,供产品端后台接入统一权限系统。
使用用户名和密码:
git config --global url."https://<username>:<password>@code.clickto.dev/".insteadOf "https://code.clickto.dev/"
或者通过 credential helper 避免明文密码(第一次 git pull 时会提示输入,之后自动记住):
git config --global credential.helper store
go env -w GOPRIVATE="code.clickto.dev/*"
go env -w GONOSUMDB="code.clickto.dev/*"
go get code.clickto.dev/weiym/permlib@latest
发布新版本时,在仓库打 tag:
git tag v0.1.0
git push origin v0.1.0
其他项目安装指定版本:
go get code.clickto.dev/weiym/permlib@v0.1.0
engine, err := permlib.New(permlib.Config{
ProductCode: "your-product",
AppKey: "ak_xxx",
AppSecret: "sk_xxx",
PermServerAddr: "perm-system:10002",
FieldWriteMode: permlib.FieldWriteSilent,
Callbacks: permlib.AuthCallbacks{
OnError: func(w http.ResponseWriter, r *http.Request, httpStatus int, code int, msg string) {
// 返回错误响应
},
OnSuccess: func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc, user *permlib.UserInfo, hasDataPerm bool) {
if !hasDataPerm {
// 返回空数据
return
}
next(w, r)
},
},
})
engine.RegisterPerms(perms.Perms)
engine.RegisterRoutePerms(perms.RoutePerms)
engine.RegisterFieldPerms(perms.FieldPerms)
if err := engine.Start(context.Background()); err != nil {
panic(err)
}
func (m *PermAuthMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
return m.engine.AuthMiddleware(next)
}
// 登录
result, err := engine.Login(ctx, username, password)
// 刷新 token
result, err := engine.RefreshToken(ctx, refreshToken)
// 登出(使该用户所有已签发令牌立即失效)
err := engine.Logout(ctx, accessToken)
user := permlib.GetUser(r.Context())
// user.UserId, user.Username, user.Perms ...
在 go-zero 的 api 文件中通过 perm tag 声明字段权限,由 permgen 插件自动生成映射表:
type CreateUserReq {
Username string `json:"username"`
Email string `json:"email" perm:"data:user:email:write"`
Salary int64 `json:"salary" perm:"data:user:salary:write"`
}
type UserListItem {
Username string `json:"username"`
Email string `json:"email" perm:"data:user:email:read"`
Salary int64 `json:"salary" perm:"data:user:salary:read"`
}
write):用户无权时,字段从请求体中静默删除或拒绝请求(取决于 FieldWriteMode)read):用户无权时,字段从响应体中自动移除| 类型 | 格式 | 说明 |
|---|---|---|
| 接口权限 | api:model:action |
控制能否访问接口 |
| 数据权限 | data:model:action |
控制能否看到响应数据 |
| 字段读权限 | data:model:field:read |
控制能否读取某字段 |
| 字段写权限 | data:model:field:write |
控制能否写入某字段 |
api:* 和 data:* 权限自动成对生成,无需手动声明。
配合 goctl 使用,自动从 api 文件生成权限注册代码:
goctl api go -api your.api -dir . --plugin /path/to/permgen
生成 internal/perms/perms.go,包含 Perms、RoutePerms、FieldPerms 三个变量,在 serviceContext 中注册即可。