105 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			105 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package middleware
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"github.com/gin-gonic/gin"
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/pkg"
							 | 
						||
| 
								 | 
							
									"go-admin/common/middleware/dto"
							 | 
						||
| 
								 | 
							
									"go-admin/common/service/sysservice/sysstatuscode"
							 | 
						||
| 
								 | 
							
									statuscode "go-admin/common/status_code"
							 | 
						||
| 
								 | 
							
									"go-admin/pkg/cryptohelper/jwthelper"
							 | 
						||
| 
								 | 
							
									"strconv"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/go-admin-team/go-admin-core/sdk/config"
							 | 
						||
| 
								 | 
							
									jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
							 | 
						||
| 
								 | 
							
									"go-admin/common/middleware/handler"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// AuthInit jwt验证new
							 | 
						||
| 
								 | 
							
								func AuthInit() (*jwt.GinJWTMiddleware, error) {
							 | 
						||
| 
								 | 
							
									timeout := time.Hour
							 | 
						||
| 
								 | 
							
									if config.ApplicationConfig.Mode == "dev" {
							 | 
						||
| 
								 | 
							
										timeout = time.Duration(876010) * time.Hour
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										if config.JwtConfig.Timeout != 0 {
							 | 
						||
| 
								 | 
							
											timeout = time.Duration(config.JwtConfig.Timeout) * time.Second
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return jwt.New(&jwt.GinJWTMiddleware{
							 | 
						||
| 
								 | 
							
										Realm:           "test zone",
							 | 
						||
| 
								 | 
							
										Key:             []byte(config.JwtConfig.Secret),
							 | 
						||
| 
								 | 
							
										Timeout:         timeout,
							 | 
						||
| 
								 | 
							
										MaxRefresh:      time.Hour,
							 | 
						||
| 
								 | 
							
										PayloadFunc:     handler.PayloadFunc,
							 | 
						||
| 
								 | 
							
										IdentityHandler: handler.IdentityHandler,
							 | 
						||
| 
								 | 
							
										Authenticator:   handler.Authenticator,
							 | 
						||
| 
								 | 
							
										Authorizator:    handler.Authorizator,
							 | 
						||
| 
								 | 
							
										Unauthorized:    handler.Unauthorized,
							 | 
						||
| 
								 | 
							
										TokenLookup:     "header: Authorization, query: token, cookie: jwt",
							 | 
						||
| 
								 | 
							
										TokenHeadName:   "Bearer",
							 | 
						||
| 
								 | 
							
										TimeFunc:        time.Now,
							 | 
						||
| 
								 | 
							
									})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func FrontedAuth(c *gin.Context) {
							 | 
						||
| 
								 | 
							
									// 从请求头中获取 token 和 os
							 | 
						||
| 
								 | 
							
									token := c.GetHeader("Authorization")
							 | 
						||
| 
								 | 
							
									source, _ := strconv.Atoi(c.GetHeader("os"))
							 | 
						||
| 
								 | 
							
									// 如果 token 不存在,返回未登录的状态
							 | 
						||
| 
								 | 
							
									if len(token) == 0 {
							 | 
						||
| 
								 | 
							
										err := ResponseWithStatus(c, dto.NotLoginStatus, statuscode.NotLoggedIn)
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											return
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										c.Abort() // 停止后续中间件的执行
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									// 验证 token 并获取结果
							 | 
						||
| 
								 | 
							
									flag, rew := jwthelper.MidValidToken(token, source)
							 | 
						||
| 
								 | 
							
									if flag < 0 || len(rew) == 0 {
							 | 
						||
| 
								 | 
							
										if flag == -1 {
							 | 
						||
| 
								 | 
							
											ResponseWithStatus(c, dto.NotLoginStatus, statuscode.NotLoggedIn)
							 | 
						||
| 
								 | 
							
										} else if flag == -2 {
							 | 
						||
| 
								 | 
							
											ResponseWithStatus(c, dto.ReLoginStatus, statuscode.ReLogin)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										c.Abort() // 停止后续中间件的执行
							 | 
						||
| 
								 | 
							
										return
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									// 将解析后的 token 设置到请求头中
							 | 
						||
| 
								 | 
							
									c.Request.Header.Set("ParseToken", rew)
							 | 
						||
| 
								 | 
							
									// 继续处理请求
							 | 
						||
| 
								 | 
							
									c.Next()
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ResponseWithStatus 带状态的响应
							 | 
						||
| 
								 | 
							
								func ResponseWithStatus(ctx *gin.Context, status int, code int, data ...interface{}) error {
							 | 
						||
| 
								 | 
							
									// 获取语言对应的 msg
							 | 
						||
| 
								 | 
							
									msg := sysstatuscode.GetStatusCodeDescription(ctx, code)
							 | 
						||
| 
								 | 
							
									if msg == `` {
							 | 
						||
| 
								 | 
							
										msg = strconv.Itoa(code)
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										// 配置了语言包参数
							 | 
						||
| 
								 | 
							
										if strings.Contains(msg, "%") && len(data) > 1 {
							 | 
						||
| 
								 | 
							
											msg = fmt.Sprintf(msg, data[1:]...)
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									resp := dto.Response{
							 | 
						||
| 
								 | 
							
										Status: status,
							 | 
						||
| 
								 | 
							
										Code:   code,
							 | 
						||
| 
								 | 
							
										Msg:    msg,
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									resp.RequestID = pkg.GenerateMsgIDFromContext(ctx)
							 | 
						||
| 
								 | 
							
									if len(data) > 0 {
							 | 
						||
| 
								 | 
							
										resp.Data = data[0]
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									ctx.JSON(200, resp)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 |