package user import ( "slices" "time" ) // AnonymousUser 调试模式下的用户 const AnonymousUser ID = "anonymous" type Token struct { Aud string `json:"aud"` Iss string `json:"iss"` Iat float64 `json:"iat"` Exp float64 `json:"exp"` Sub ID `json:"sub" mapstructure:"-"` 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 ID ID Valid bool } type Role string func (r Role) String() string { return string(r) } type Permission string type ID string func (u *User) GetId() ID { 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 } func (u ID) String() string { return string(u) } func (up Permission) String() string { return string(up) }