
* 媒体库增加分类,图库多选择时优化。 * 重构 JWT token 生成,使用 `New()` 函数代替直接创建实例 * 上传组件支持查看大图 (#1982) * 将参数缓存,媒体库增加分类,图库多选择时优化。 (#1978) * 媒体库增加分类,图库多选择时优化。 *修复文件上传进度显示bug&按钮样式优化 (#1986) * fix:添加内部 iframe 展示网页,优化 permission 代码 * 俩个uuid库合并一个,更新库到当前版本。 * 优化关于我们界面 * feat: 个人中心头像调整,媒体库兼容性调整。 * feat: 自动化代码前端页面美化,多余按钮收入专家模式 * feat: 增加单独生成server功能 * feat: 限制单独生成前后端的情况下的细节配置 * feat: 修复全选失败报错的问题 --------- Co-authored-by: task <121913992@qq.com> Co-authored-by: Feng.YJ <32027253+huiyifyj@users.noreply.github.com> Co-authored-by: will0523 <dygsunshine@163.com> Co-authored-by: task <ms.yangdan@gmail.com> Co-authored-by: sslee <57312216+GIS142857@users.noreply.github.com> Co-authored-by: bypanghu <bypanghu@163.com> Co-authored-by: Azir <2075125282@qq.com> Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com> Co-authored-by: krank <emosick@qq.com>
81 lines
2.7 KiB
Go
81 lines
2.7 KiB
Go
package middleware
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/utils"
|
|
"github.com/golang-jwt/jwt/v5"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/service"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
var jwtService = service.ServiceGroupApp.SystemServiceGroup.JwtService
|
|
|
|
func JWTAuth() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
// 我们这里jwt鉴权取头部信息 x-token 登录时回返回token信息 这里前端需要把token存储到cookie或者本地localStorage中 不过需要跟后端协商过期时间 可以约定刷新令牌或者重新登录
|
|
token := utils.GetToken(c)
|
|
if token == "" {
|
|
response.NoAuth("未登录或非法访问", c)
|
|
c.Abort()
|
|
return
|
|
}
|
|
if jwtService.IsBlacklist(token) {
|
|
response.NoAuth("您的帐户异地登陆或令牌失效", c)
|
|
utils.ClearToken(c)
|
|
c.Abort()
|
|
return
|
|
}
|
|
j := utils.NewJWT()
|
|
// parseToken 解析token包含的信息
|
|
claims, err := j.ParseToken(token)
|
|
if err != nil {
|
|
if errors.Is(err, utils.TokenExpired) {
|
|
response.NoAuth("授权已过期", c)
|
|
utils.ClearToken(c)
|
|
c.Abort()
|
|
return
|
|
}
|
|
response.NoAuth(err.Error(), c)
|
|
utils.ClearToken(c)
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
// 已登录用户被管理员禁用 需要使该用户的jwt失效 此处比较消耗性能 如果需要 请自行打开
|
|
// 用户被删除的逻辑 需要优化 此处比较消耗性能 如果需要 请自行打开
|
|
|
|
//if user, err := userService.FindUserByUuid(claims.UUID.String()); err != nil || user.Enable == 2 {
|
|
// _ = jwtService.JsonInBlacklist(system.JwtBlacklist{Jwt: token})
|
|
// response.FailWithDetailed(gin.H{"reload": true}, err.Error(), c)
|
|
// c.Abort()
|
|
//}
|
|
c.Set("claims", claims)
|
|
if claims.ExpiresAt.Unix()-time.Now().Unix() < claims.BufferTime {
|
|
dr, _ := utils.ParseDuration(global.GVA_CONFIG.JWT.ExpiresTime)
|
|
claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(dr))
|
|
newToken, _ := j.CreateTokenByOldToken(token, *claims)
|
|
newClaims, _ := j.ParseToken(newToken)
|
|
c.Header("new-token", newToken)
|
|
c.Header("new-expires-at", strconv.FormatInt(newClaims.ExpiresAt.Unix(), 10))
|
|
utils.SetToken(c, newToken, int(dr.Seconds()))
|
|
if global.GVA_CONFIG.System.UseMultipoint {
|
|
// 记录新的活跃jwt
|
|
_ = jwtService.SetRedisJWT(newToken, newClaims.Username)
|
|
}
|
|
}
|
|
c.Next()
|
|
|
|
if newToken, exists := c.Get("new-token"); exists {
|
|
c.Header("new-token", newToken.(string))
|
|
}
|
|
if newExpiresAt, exists := c.Get("new-expires-at"); exists {
|
|
c.Header("new-expires-at", newExpiresAt.(string))
|
|
}
|
|
}
|
|
}
|