json.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package share
  2. import (
  3. "crypto/rand"
  4. "demo/configs"
  5. "errors"
  6. "fmt"
  7. "github.com/dgrijalva/jwt-go"
  8. "github.com/gin-gonic/gin"
  9. "math/big"
  10. "time"
  11. )
  12. const (
  13. SECRETKEY = "243223ffslsfsldfl412fdsfsdf" //私钥
  14. )
  15. type CustomClaims struct {
  16. UserId int64
  17. jwt.StandardClaims
  18. }
  19. func GetJsonAnyParam(c *gin.Context) func(param string) (interface{}, error) {
  20. jsonData := map[string]interface{}{}
  21. err := c.BindJSON(&jsonData)
  22. return func(param string) (interface{}, error) {
  23. if err != nil {
  24. return nil, err
  25. }
  26. value, err := func() (interface{}, error) {
  27. i, exists := jsonData[param]
  28. if !exists {
  29. return nil, errors.New("缺少" + param + "字段")
  30. }
  31. return i, nil
  32. }()
  33. if err != nil {
  34. return nil, err
  35. }
  36. return value, err
  37. }
  38. }
  39. func GenerateToken(userId string) (string, error) {
  40. maxAge := 60 * 60 * 24
  41. // Create the Claims
  42. claims := &jwt.StandardClaims{
  43. ExpiresAt: time.Now().Add(time.Duration(maxAge) * time.Second).Unix(), // 过期时间,必须设置,
  44. Issuer: userId, // 非必须,也可以填充用户名,
  45. }
  46. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  47. tokenString, err := token.SignedString([]byte(SECRETKEY))
  48. if err != nil {
  49. fmt.Println(err)
  50. }
  51. return tokenString, err
  52. }
  53. func ParseToken(tokenString string) (jwt.MapClaims, error) {
  54. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  55. // Don't forget to validate the alg is what you expect:
  56. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  57. return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
  58. }
  59. // hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key")
  60. return []byte(SECRETKEY), nil
  61. })
  62. if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
  63. return claims, nil
  64. } else {
  65. return nil, err
  66. }
  67. }
  68. func JwtMiddleware() gin.HandlerFunc {
  69. return func(c *gin.Context) {
  70. tokenString := c.GetHeader("auth-sign")
  71. if tokenString == "" {
  72. c.JSON(401, gin.H{"message": "缺少token"})
  73. c.Abort()
  74. return
  75. }
  76. token, err := ParseToken(tokenString)
  77. if err != nil {
  78. c.JSON(401, gin.H{"message": "无效令牌"})
  79. c.Abort()
  80. return
  81. }
  82. users := make([]configs.MysqlData, 0)
  83. bools, err := configs.Engine.Table("user").Join("INNER", "role", "role.id = user.role_id").Join("INNER", "role_authority", "role_authority.authority_id = role.id").Join("INNER", "authority", "authority.id = role_authority.authority_id").Where("authority.authority_path=?", c.Request.URL.Path).Where("user.id = ?", token["iss"]).Exist(&users)
  84. if err == nil {
  85. fmt.Println(bools)
  86. if bools {
  87. c.Next()
  88. } else {
  89. c.JSON(200, gin.H{"message": "权限不足"})
  90. c.Abort()
  91. return
  92. }
  93. }
  94. }
  95. }
  96. func RandomInt(min, max *big.Int) *big.Int {
  97. // 读取密码学安全的随机比特
  98. byteLen := (max.BitLen() + 7) / 8
  99. b := make([]byte, byteLen)
  100. rand.Read(b)
  101. // 将字节转换为大整数
  102. r := new(big.Int).SetBytes(b)
  103. // 需要将生成的大整数范围限制在[min,max]
  104. r.Rem(r, new(big.Int).Sub(max, min)).Add(r, min)
  105. return r
  106. }