|
@@ -84,6 +84,9 @@ type GinJWTMiddleware struct {
|
|
|
|
|
|
// roleId
|
|
|
RoleIdKey string
|
|
|
+ //deptId
|
|
|
+ DeptIdKey string
|
|
|
+ DeptNameKey string
|
|
|
|
|
|
RoleKey string
|
|
|
|
|
@@ -166,11 +169,13 @@ var (
|
|
|
|
|
|
ErrAccountDeactivated = errors.New("账号已停用")
|
|
|
|
|
|
+ ErrSingleLogin = errors.New("您的账号已在其他地方登录,请重新登录或退出")
|
|
|
+
|
|
|
// ErrFailedTokenCreation indicates JWT Token failed to create, reason unknown
|
|
|
ErrFailedTokenCreation = errors.New("failed to create JWT Token")
|
|
|
|
|
|
// ErrExpiredToken indicates JWT token has expired. Can't refresh.
|
|
|
- ErrExpiredToken = errors.New("token is expired")
|
|
|
+ ErrExpiredToken = errors.New("Token is expired")
|
|
|
|
|
|
// ErrEmptyAuthHeader can be thrown if authing with a HTTP header, the Auth header needs to be set
|
|
|
ErrEmptyAuthHeader = errors.New("auth header is empty")
|
|
@@ -227,6 +232,10 @@ var (
|
|
|
RoleNameKey = "roleName"
|
|
|
// 单一登录标识
|
|
|
SingleKey = "single"
|
|
|
+
|
|
|
+ // DeptIdKey 部门 Old
|
|
|
+ DeptIdKey = "deptId"
|
|
|
+ DeptNameKey = "deptName"
|
|
|
)
|
|
|
|
|
|
// New for check error with GinJWTMiddleware
|
|
@@ -385,8 +394,13 @@ func (mw *GinJWTMiddleware) middlewareImpl(c *gin.Context) {
|
|
|
|
|
|
claims, err := mw.GetClaimsFromJWT(c)
|
|
|
if err != nil {
|
|
|
- mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c))
|
|
|
- return
|
|
|
+ if err.Error() == ErrExpiredToken.Error() {
|
|
|
+ mw.unauthorized(c, 6401, mw.HTTPStatusMessageFunc(ErrExpiredToken, c))
|
|
|
+ return
|
|
|
+ } else {
|
|
|
+ mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(err, c))
|
|
|
+ return
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if claims["exp"] == nil {
|
|
@@ -418,11 +432,12 @@ func (mw *GinJWTMiddleware) middlewareImpl(c *gin.Context) {
|
|
|
if claims["single"].(bool) {
|
|
|
token, err := mw.GetNewestToken(c, int64(claims["identity"].(float64)))
|
|
|
if err != nil && errors.Is(err, redis.Nil) {
|
|
|
- mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrExpiredToken, c))
|
|
|
+ // 没有获取到最新的token
|
|
|
+ mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrEmptyQueryToken, c))
|
|
|
return
|
|
|
}
|
|
|
if token != GetToken(c) {
|
|
|
- mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrExpiredToken, c))
|
|
|
+ mw.unauthorized(c, http.StatusUnauthorized, mw.HTTPStatusMessageFunc(ErrSingleLogin, c))
|
|
|
return
|
|
|
}
|
|
|
}
|
|
@@ -518,9 +533,6 @@ func (mw *GinJWTMiddleware) signedString(token *jwt.Token) (string, error) {
|
|
|
return tokenString, err
|
|
|
}
|
|
|
|
|
|
-// RefreshHandler can be used to refresh a token. The token still needs to be valid on refresh.
|
|
|
-// Shall be put under an endpoint that is using the GinJWTMiddleware.
|
|
|
-// Reply will be of the form {"token": "TOKEN"}.
|
|
|
func (mw *GinJWTMiddleware) RefreshHandler(c *gin.Context) {
|
|
|
tokenString, expire, err := mw.RefreshToken(c)
|
|
|
if err != nil {
|
|
@@ -570,7 +582,7 @@ func (mw *GinJWTMiddleware) RefreshToken(c *gin.Context) (string, time.Time, err
|
|
|
}
|
|
|
|
|
|
if claims["single"].(bool) {
|
|
|
- _ = mw.SaveNewestToken(c, int64(claims["identity"].(int)), tokenString, int64(mw.Timeout)/3600)
|
|
|
+ _ = mw.SaveNewestToken(c, int64(claims["identity"].(float64)), tokenString, int64(mw.Timeout)/3600)
|
|
|
}
|
|
|
|
|
|
return tokenString, expire, nil
|
|
@@ -731,8 +743,8 @@ func (mw *GinJWTMiddleware) unauthorized(c *gin.Context, code int, message strin
|
|
|
if !mw.DisabledAbort {
|
|
|
c.Abort()
|
|
|
}
|
|
|
-
|
|
|
mw.Unauthorized(c, code, message)
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// ExtractClaims help to extract the JWT claims
|