diff --git a/server/api/v1/sys_user.go b/server/api/v1/sys_user.go index bf57cf6fa2ad2598beecf6ce655c9ba4c39f7461..c8fe4911d47a5b8e628bf7230f03b13b32dfb75d 100644 --- a/server/api/v1/sys_user.go +++ b/server/api/v1/sys_user.go @@ -88,10 +88,12 @@ func tokenNext(c *gin.Context, user model.SysUser) { UUID: user.UUID, ID: user.ID, NickName: user.NickName, + Username: user.Username, AuthorityId: user.AuthorityId, + BufferTime: 60*60*24, // 缓冲时间1天 缓冲时间内会获得新的token刷新令牌 此时一个用户会存在两个有效令牌 但是前端只留一个 另一个会丢失 StandardClaims: jwt.StandardClaims{ NotBefore: time.Now().Unix() - 1000, // 签名生效时间 - ExpiresAt: time.Now().Unix() + 60*60*24*7, // 过期时间 一周 + ExpiresAt: time.Now().Unix() + 60*60*24*7, // 过期时间 7天 Issuer: "qmPlus", // 签名的发行者 }, } @@ -108,11 +110,9 @@ func tokenNext(c *gin.Context, user model.SysUser) { }, c) return } - var loginJwt model.JwtBlacklist - loginJwt.Jwt = token err, jwtStr := service.GetRedisJWT(user.Username) if err == redis.Nil { - if err := service.SetRedisJWT(loginJwt, user.Username); err != nil { + if err := service.SetRedisJWT(token, user.Username); err != nil { response.FailWithMessage("设置登录状态失败", c) return } @@ -130,7 +130,7 @@ func tokenNext(c *gin.Context, user model.SysUser) { response.FailWithMessage("jwt作废失败", c) return } - if err := service.SetRedisJWT(loginJwt, user.Username); err != nil { + if err := service.SetRedisJWT(jwtStr, user.Username); err != nil { response.FailWithMessage("设置登录状态失败", c) return } diff --git a/server/middleware/jwt.go b/server/middleware/jwt.go index ee6add1c408bb7f9bd6fa82b17588c9efe050c78..b85bfbb1e1bb90bebb0d2a11a2424a82aeb2a125 100644 --- a/server/middleware/jwt.go +++ b/server/middleware/jwt.go @@ -9,6 +9,7 @@ import ( "gin-vue-admin/service" "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" + "strconv" "time" ) @@ -16,9 +17,6 @@ func JWTAuth() gin.HandlerFunc { return func(c *gin.Context) { // 我们这里jwt鉴权取头部信息 x-token 登录时回返回token信息 这里前端需要把token存储到cookie或者本地localSstorage中 不过需要跟后端协商过期时间 可以约定刷新令牌或者重新登录 token := c.Request.Header.Get("x-token") - modelToken := model.JwtBlacklist{ - Jwt: token, - } if token == "" { response.Result(response.ERROR, gin.H{ "reload": true, @@ -26,7 +24,7 @@ func JWTAuth() gin.HandlerFunc { c.Abort() return } - if service.IsBlacklist(token, modelToken) { + if service.IsBlacklist(token) { response.Result(response.ERROR, gin.H{ "reload": true, }, "您的帐户异地登陆或令牌失效", c) @@ -50,6 +48,24 @@ func JWTAuth() gin.HandlerFunc { c.Abort() return } + if claims.ExpiresAt - time.Now().Unix() { const token = store.getters['user/token'] - // if (token) { - // const expiresAt = store.getters['user/expiresAt'] - // const nowUnix = new Date().getTime() - // const hasExpires = (expiresAt - nowUnix) < 0 - // if (hasExpires) { - // store.dispatch['user/claerAll'] - // } - // } // 在白名单中的判断情况 if (whiteList.indexOf(to.name) > -1) { if (token) { diff --git a/web/src/store/module/user.js b/web/src/store/module/user.js index 3da55ea67977d62128693b89399a425743b2150c..4af31522d6ffca0d0a186a0b7064f8e024393db8 100644 --- a/web/src/store/module/user.js +++ b/web/src/store/module/user.js @@ -11,7 +11,6 @@ export const user = { authority: "", }, token: "", - expiresAt: "" }, mutations: { setUserInfo(state, userInfo) { @@ -22,14 +21,9 @@ export const user = { // 这里的 `state` 对象是模块的局部状态 state.token = token }, - setExpiresAt(state, expiresAt) { - // 这里的 `state` 对象是模块的局部状态 - state.expiresAt = expiresAt - }, LoginOut(state) { state.userInfo = {} state.token = "" - state.expiresAt = "" router.push({ name: 'login', replace: true }) sessionStorage.clear() window.location.reload() @@ -45,7 +39,6 @@ export const user = { const res = await login(loginInfo) commit('setUserInfo', res.data.user) commit('setToken', res.data.token) - commit('setExpiresAt', res.data.expiresAt) if (res.code == 0) { const redirect = router.history.current.query.redirect if (redirect) { @@ -69,8 +62,6 @@ export const user = { token(state) { return state.token }, - expiresAt(state) { - return state.expiresAt - } + } } \ No newline at end of file diff --git a/web/src/utils/request.js b/web/src/utils/request.js index d6e7d86757cd09d62bf7fe9f2e78a8798452ac2f..c3524db560136de889545b849435856388231e7c 100644 --- a/web/src/utils/request.js +++ b/web/src/utils/request.js @@ -21,13 +21,13 @@ const showLoading = () => { } const closeLoading = () => { - acitveAxios-- - if (acitveAxios <= 0) { - clearTimeout(timer) - loadingInstance && loadingInstance.close() + acitveAxios-- + if (acitveAxios <= 0) { + clearTimeout(timer) + loadingInstance && loadingInstance.close() + } } -} -//http request 拦截器 + //http request 拦截器 service.interceptors.request.use( config => { showLoading() @@ -37,7 +37,7 @@ service.interceptors.request.use( config.headers = { 'Content-Type': 'application/json', 'x-token': token, - 'x-user-id':user.ID + 'x-user-id': user.ID } return config; }, @@ -57,6 +57,9 @@ service.interceptors.request.use( service.interceptors.response.use( response => { closeLoading() + if (response.headers["new-token"]) { + store.commit('user/setToken', response.headers["new-token"]) + } if (response.data.code == 0 || response.headers.success === "true") { return response.data } else {