feat(auth): 添加JWT与Casbin权限认证功能

This commit is contained in:
unclesam committed 2026-07-07 20:24:30 +08:00
1 parent fe86c081f4
commit 16a9f64109
9 files changed
+236 -27

No files matched your search

+90
View File
@@ -0,0 +1,90 @@
package jwts
import (
"EnGin/internal/global"
"errors"
"time"
"github.com/golang-jwt/jwt/v5"
)
type Claims struct {
UserID uint `json:"user_id"`
Roles []uint `json:"roles"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
Email string `json:"email"`
}
type RefreshClaims struct {
UserID uint `json:"user_id"`
jwt.RegisteredClaims
}
type MyClaims struct {
Claims
jwt.RegisteredClaims
}
// GenAccessToken 生成Access Token
func GenAccessToken(data Claims) (string, error) {
claims := MyClaims{
Claims: data,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(global.Config.Jwt.AccessExpire) * time.Hour)),
Issuer: global.Config.Jwt.Issuer,
},
}
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(global.Config.Jwt.AccessSecret))
}
// GenRefreshToken 生成Refresh Token
func GenRefreshToken(userID uint) (string, error) {
claims := RefreshClaims{
UserID: userID,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(global.Config.Jwt.RefreshExpire) * time.Hour)),
Issuer: global.Config.Jwt.Issuer + "_refresh",
},
}
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(global.Config.Jwt.RefreshSecret))
}
// CheckAccessToken 验证访问令牌
func CheckAccessToken(token string) (*MyClaims, error) {
claims, err := parseToken(token, global.Config.Jwt.AccessSecret, &MyClaims{})
if err != nil {
return nil, err
}
return claims.(*MyClaims), nil
}
// CheckRefreshToken 验证刷新令牌
func CheckRefreshToken(token string) (*RefreshClaims, error) {
claims, err := parseToken(token, global.Config.Jwt.RefreshSecret, &RefreshClaims{})
if err != nil {
return nil, err
}
return claims.(*RefreshClaims), nil
}
// parseToken 通用token解析函数
func parseToken(token, secret string, claims jwt.Claims) (jwt.Claims, error) {
tokenObj, err := jwt.ParseWithClaims(token, claims, func(t *jwt.Token) (interface{}, error) {
return []byte(secret), nil
})
if err != nil {
return nil, err
}
if tokenObj.Valid {
return tokenObj.Claims, nil
}
return nil, errors.New("token无效")
}