2024-12-05 17:44:29 +00:00
|
|
|
package user
|
|
|
|
|
|
|
|
import (
|
|
|
|
"slices"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
2024-12-06 15:38:22 +00:00
|
|
|
// AnonymousUser 调试模式下的用户
|
2024-12-06 18:44:32 +00:00
|
|
|
const AnonymousUser ID = "anonymous"
|
2024-12-06 15:38:22 +00:00
|
|
|
|
2024-12-05 17:44:29 +00:00
|
|
|
type Token struct {
|
|
|
|
Aud string `json:"aud"`
|
|
|
|
Iss string `json:"iss"`
|
|
|
|
Iat float64 `json:"iat"`
|
|
|
|
Exp float64 `json:"exp"`
|
2024-12-06 18:44:32 +00:00
|
|
|
Sub ID `json:"sub" mapstructure:"-"`
|
2024-12-05 17:44:29 +00:00
|
|
|
Scopes []string `json:"scopes"`
|
|
|
|
Roles []Role `json:"roles,omitempty"`
|
|
|
|
Permissions []Permission `json:"permissions"`
|
|
|
|
Uuid string `json:"uuid"`
|
|
|
|
Avatar string `json:"avatar"`
|
|
|
|
Name string `json:"name"`
|
|
|
|
EmailVerified bool `json:"email_verified"`
|
|
|
|
RealNameVerified bool `json:"real_name_verified"`
|
|
|
|
PhoneVerified bool `json:"phone_verified"`
|
|
|
|
Email string `json:"email"`
|
|
|
|
Phone string `json:"phone"`
|
|
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type User struct {
|
|
|
|
Token Token
|
2024-12-06 18:44:32 +00:00
|
|
|
ID ID
|
2024-12-05 17:44:29 +00:00
|
|
|
Valid bool
|
|
|
|
}
|
|
|
|
|
|
|
|
type Role string
|
|
|
|
|
|
|
|
func (r Role) String() string {
|
|
|
|
return string(r)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Permission string
|
|
|
|
|
2024-12-06 18:44:32 +00:00
|
|
|
type ID string
|
2024-12-05 17:44:29 +00:00
|
|
|
|
2024-12-06 18:44:32 +00:00
|
|
|
func (u *User) GetId() ID {
|
2024-12-05 17:44:29 +00:00
|
|
|
return u.Token.Sub
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetName() string {
|
|
|
|
return u.Token.Name
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetEmail() string {
|
|
|
|
return u.Token.Email
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetPhone() string {
|
|
|
|
return u.Token.Phone
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetRoles() []Role {
|
|
|
|
return u.Token.Roles
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetPermissions() []Permission {
|
|
|
|
return u.Token.Permissions
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetAvatar() string {
|
|
|
|
return u.Token.Avatar
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) GetUuid() string {
|
|
|
|
return u.Token.Uuid
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) HasRoles(roles ...Role) bool {
|
|
|
|
if len(roles) == 0 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, role := range roles {
|
|
|
|
pass := slices.Contains(u.Token.Roles, role)
|
|
|
|
|
|
|
|
if !pass {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (u *User) HasPermissions(permissions ...Permission) bool {
|
|
|
|
if len(permissions) == 0 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, p := range permissions {
|
|
|
|
pass := slices.Contains(u.Token.Permissions, p)
|
|
|
|
|
|
|
|
if !pass {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2024-12-06 18:44:32 +00:00
|
|
|
func (u ID) String() string {
|
2024-12-05 17:44:29 +00:00
|
|
|
return string(u)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (up Permission) String() string {
|
|
|
|
return string(up)
|
|
|
|
}
|