100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
package auth
|
||
|
||
import (
|
||
client2 "platform/web/domains/client"
|
||
)
|
||
|
||
// Context 定义认证信息
|
||
type Context struct {
|
||
Payload Payload `json:"payload"`
|
||
Permissions map[string]struct{} `json:"permissions,omitempty"`
|
||
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
||
}
|
||
|
||
func (a *Context) AnyType(types ...PayloadType) bool {
|
||
if a == nil {
|
||
return false
|
||
}
|
||
for _, t := range types {
|
||
if a.Payload.Type == t {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
// AnyPermission 检查认证是否包含指定权限
|
||
func (a *Context) AnyPermission(requiredPermission ...string) bool {
|
||
if a == nil || a.Permissions == nil {
|
||
return false
|
||
}
|
||
for _, permission := range requiredPermission {
|
||
if _, ok := a.Permissions[permission]; ok {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
// Payload 定义负载信息
|
||
type Payload struct {
|
||
Id int32 `json:"id,omitempty"`
|
||
Type PayloadType `json:"type,omitempty"`
|
||
Name string `json:"name,omitempty"`
|
||
Avatar string `json:"avatar,omitempty"`
|
||
}
|
||
|
||
type PayloadType int
|
||
|
||
const (
|
||
PayloadNone PayloadType = iota // 游客
|
||
PayloadUser // 用户
|
||
PayloadAdmin // 管理员
|
||
PayloadPublicServer // 公共服务(public_client)
|
||
PayloadSecuredServer // 安全服务(credential_client)
|
||
PayloadInternalServer // 内部服务
|
||
)
|
||
|
||
func (t PayloadType) ToStr() string {
|
||
switch t {
|
||
case PayloadUser:
|
||
return "user"
|
||
case PayloadAdmin:
|
||
return "admn"
|
||
case PayloadPublicServer:
|
||
return "cpub"
|
||
case PayloadSecuredServer:
|
||
return "ccnf"
|
||
default:
|
||
return "none"
|
||
}
|
||
}
|
||
|
||
func PayloadTypeFromStr(name string) PayloadType {
|
||
switch name {
|
||
case "user":
|
||
return PayloadUser
|
||
case "admn":
|
||
return PayloadAdmin
|
||
case "cpub":
|
||
return PayloadPublicServer
|
||
case "ccnf":
|
||
return PayloadSecuredServer
|
||
default:
|
||
return PayloadNone
|
||
}
|
||
}
|
||
|
||
func PayloadTypeFromClientSpec(spec client2.Spec) PayloadType {
|
||
var clientType PayloadType
|
||
switch spec {
|
||
case client2.SpecNative, client2.SpecBrowser:
|
||
clientType = PayloadPublicServer
|
||
case client2.SpecWeb:
|
||
clientType = PayloadSecuredServer
|
||
case client2.SpecTrusted:
|
||
clientType = PayloadInternalServer
|
||
}
|
||
return clientType
|
||
}
|