admin.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package model
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "encoding/base64"
  6. "log"
  7. "math/rand"
  8. )
  9. type Admin struct {
  10. Id interface{} `json:"id" bson:"_id"` // 自增ID
  11. Username string `json:"username" bson:"username"` // 用户名
  12. Password string `json:"password" bson:"password"` // 密码
  13. RealName string `json:"real_name" bson:"real_name"` // 真实姓名
  14. Pid any `json:"pid" bson:"pid"` // 父级ID
  15. RoleId string `json:"role_id" bson:"role_id"` // 角色ID
  16. Status int `json:"status" bson:"status"` // 状态 0:禁用 1:启用
  17. ManagerAuth int8 `json:"manager_auth" bson:"manager_auth"` // 管理员权限
  18. LastLoginIp string `json:"last_login_ip" bson:"last_login_ip"` // 最后登录IP
  19. LastLoginTime int64 `json:"last_login_time" bson:"last_login_time"` // 最后登录时间
  20. CreatedAt int64 `json:"created_at" bson:"created_at"`
  21. UpdatedAt int64 `json:"updated_at" bson:"updated_at"`
  22. DeletedAt int64 `json:"deleted_at" bson:"deleted_at"`
  23. }
  24. func (a *Admin) TableName() string {
  25. return "admin"
  26. }
  27. const tokenLength = 32 // 定义token长度
  28. // GenerateToken 生成一个安全的token字符串
  29. func (a *Admin) GenerateToken() (string, error) {
  30. key := make([]byte, 32) // AES-256 key length
  31. _, err := rand.Read(key)
  32. if err != nil {
  33. log.Printf("Failed to generate random key: %s", err)
  34. return "", err
  35. }
  36. block, err := aes.NewCipher(key)
  37. if err != nil {
  38. log.Printf("Failed to create AES cipher: %s", err)
  39. return "", err
  40. }
  41. token := make([]byte, tokenLength)
  42. gcm, err := cipher.NewGCM(block)
  43. if err != nil {
  44. log.Printf("Failed to create GCM: %s", err)
  45. return "", err
  46. }
  47. nonce := make([]byte, gcm.NonceSize())
  48. _, err = rand.Read(nonce)
  49. if err != nil {
  50. log.Printf("Failed to generate random nonce: %s", err)
  51. return "", err
  52. }
  53. token = gcm.Seal(nil, nonce, token, nil)
  54. return base64.URLEncoding.EncodeToString(token), nil
  55. }
  56. func (a *Admin) GetID() interface{} {
  57. return a.Id
  58. }