代码拉取完成,页面将自动刷新
package authorization
import (
authzv1 "github.com/marmotedu/api/authz/v1"
"github.com/ory/ladon"
)
// 功能:创建验证人结构 并构建验证权限
// 授权人 外部调用
type Authorizer struct {
// warden(管理人)
warden ladon.Warden //ladon 验证的接口[IsAllowed(r *Request) error] 根据请求判断是否有权限
}
// 根据 权限相关接口 初始化授权对象 authorizationClient 实际上注意目的就是获取策略(从cache中得到)
func NewAuthorizer(authorizationClient AuthorizationInterface)*Authorizer {
return &Authorizer{
warden: &ladon.Ladon{ //构建 如何进行认证的结构体
//返回 ladon.Manager接口 传入authorizationClient接口 (使用其得到用户权限)
Manager: NewPolicyManager(authorizationClient), // 根据Username得到改用户所有权限
// 用来记录被拒绝的授权请求和被允许的授权请求
// AuditLogger: NewAuditLogger(authorizationClient), //AuditLogger 是一个 interface 该 AuditLogger 会在授权时打印调用的策略到标准错误
AuditLogger: &ladon.AuditLoggerInfo{}, // 会默认输出到 stderr
},
}
}
// 验证函数
func (a *Authorizer) Authorize(request *ladon.Request) *authzv1.Response {
// request 中 在controller将username添加到 request.Context中了
// 在 ladon 包中如何 执行 IsAllowed 的
/*
func (l *Ladon) IsAllowed(r *Request) (err error) {
// Manager 相关 FindRequestCandidates即外部实现的得到username用户所有权限
policies, err := l.Manager.FindRequestCandidates(r)
if err != nil { //
go l.metric().RequestProcessingError(*r, nil, err)
return err
}
// 根据权限 通过用户去验证
return l.DoPoliciesAllow(r, policies)
}
IsAllowed 会调用 DoPoliciesAllow(r, policies) 函数进行权限校验。
如果权限校验不通过(请求在指定条件下不能够对资源做指定操作),就调用 LogRejectedAccessRequest 函数记录拒绝的请求,
并返回值为非 nil 的 error,error 中记录了授权失败的错误信息。
如果权限校验通过,则调用 LogGrantedAccessRequest 函数记录允许的请求,并返回值为 nil 的 error。
DoPoliciesAllow 在 ladon.go中
*/
// todo 出现问题
if err:=a.warden.IsAllowed(request);err!=nil{
// fmt.Println("验证权限************err",err)
return &authzv1.Response{
Denied: true,
Reason: err.Error(),
}
}
return &authzv1.Response{
Allowed: true,
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。