221 lines
4.7 KiB
Go
221 lines
4.7 KiB
Go
package middleware
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/net/ghttp"
|
|
"nl-video-api/internal/service/auth"
|
|
"nl-video-api/utility/jwt"
|
|
"nl-video-api/utility/response"
|
|
)
|
|
|
|
// PermissionMiddleware 权限验证中间件
|
|
func PermissionMiddleware(r *ghttp.Request) {
|
|
// 获取请求路径和方法
|
|
apiPath := r.URL.Path
|
|
method := r.Method
|
|
|
|
// 跳过不需要权限验证的路径
|
|
skipPaths := []string{
|
|
"/api/v1/auth/login",
|
|
"/api/v1/auth/register",
|
|
"/api/v1/admin/login",
|
|
"/api/v1/admin/register",
|
|
}
|
|
|
|
for _, skipPath := range skipPaths {
|
|
if apiPath == skipPath {
|
|
r.Middleware.Next()
|
|
return
|
|
}
|
|
}
|
|
|
|
// 获取Token
|
|
token := r.Header.Get("Authorization")
|
|
if token == "" {
|
|
response.Error(r, 1002, "请先登录")
|
|
return
|
|
}
|
|
|
|
// 移除Bearer前缀
|
|
if strings.HasPrefix(token, "Bearer ") {
|
|
token = strings.TrimPrefix(token, "Bearer ")
|
|
}
|
|
|
|
// 验证Token
|
|
claims, err := jwt.ParseToken(token)
|
|
if err != nil {
|
|
response.Error(r, 1003, "Token无效")
|
|
return
|
|
}
|
|
|
|
// 获取用户ID
|
|
userId := int(claims.UserID)
|
|
if userId <= 0 {
|
|
response.Error(r, 1003, "Token无效")
|
|
return
|
|
}
|
|
|
|
// 检查API权限
|
|
hasPermission, err := auth.Permission.CheckApiPermission(r.Context(), userId, apiPath, method)
|
|
if err != nil {
|
|
g.Log().Errorf(r.Context(), "权限检查失败: %v", err)
|
|
response.Error(r, 1004, "权限检查失败")
|
|
return
|
|
}
|
|
|
|
if !hasPermission {
|
|
response.Error(r, 1004, "没有访问权限")
|
|
return
|
|
}
|
|
|
|
// 将用户ID存储到上下文中
|
|
r.SetCtxVar("user_id", userId)
|
|
|
|
r.Middleware.Next()
|
|
}
|
|
|
|
// RolePermissionMiddleware 角色权限验证中间件
|
|
func RolePermissionMiddleware(requiredRole string) func(r *ghttp.Request) {
|
|
return func(r *ghttp.Request) {
|
|
// 获取Token
|
|
token := r.Header.Get("Authorization")
|
|
if token == "" {
|
|
response.Error(r, 1002, "请先登录")
|
|
return
|
|
}
|
|
|
|
// 移除Bearer前缀
|
|
if strings.HasPrefix(token, "Bearer ") {
|
|
token = strings.TrimPrefix(token, "Bearer ")
|
|
}
|
|
|
|
// 验证Token
|
|
claims, err := jwt.ParseToken(token)
|
|
if err != nil {
|
|
response.Error(r, 1003, "Token无效")
|
|
return
|
|
}
|
|
|
|
// 获取用户角色
|
|
userRole := claims.UserType
|
|
if userRole == "" {
|
|
response.Error(r, 1004, "用户角色信息无效")
|
|
return
|
|
}
|
|
|
|
// 检查角色权限
|
|
if userRole != requiredRole && userRole != "super_admin" {
|
|
response.Error(r, 1004, "没有访问权限")
|
|
return
|
|
}
|
|
|
|
r.Middleware.Next()
|
|
}
|
|
}
|
|
|
|
// AdminPermissionMiddleware 管理员权限验证中间件
|
|
func AdminPermissionMiddleware(r *ghttp.Request) {
|
|
// 获取Token
|
|
token := r.Header.Get("Authorization")
|
|
if token == "" {
|
|
response.Error(r, 1002, "请先登录")
|
|
return
|
|
}
|
|
|
|
// 移除Bearer前缀
|
|
if strings.HasPrefix(token, "Bearer ") {
|
|
token = strings.TrimPrefix(token, "Bearer ")
|
|
}
|
|
|
|
// 验证Token
|
|
claims, err := jwt.ParseToken(token)
|
|
if err != nil {
|
|
response.Error(r, 1003, "Token无效")
|
|
return
|
|
}
|
|
|
|
// 检查是否为管理员Token
|
|
userType := claims.UserType
|
|
if userType != "admin" {
|
|
response.Error(r, 1004, "需要管理员权限")
|
|
return
|
|
}
|
|
|
|
// 获取管理员ID
|
|
adminId := int(claims.UserID)
|
|
if adminId <= 0 {
|
|
response.Error(r, 1003, "Token无效")
|
|
return
|
|
}
|
|
|
|
// 将管理员ID存储到上下文中
|
|
r.SetCtxVar("admin_id", adminId)
|
|
|
|
r.Middleware.Next()
|
|
}
|
|
|
|
// CheckPermissionCode 检查权限编码中间件
|
|
func CheckPermissionCode(permissionCode string) func(r *ghttp.Request) {
|
|
return func(r *ghttp.Request) {
|
|
// 获取用户ID
|
|
userId := r.GetCtxVar("user_id")
|
|
if userId == nil {
|
|
response.Error(r, 1002, "请先登录")
|
|
return
|
|
}
|
|
|
|
userIdInt := userId.Int()
|
|
if userIdInt <= 0 {
|
|
response.Error(r, 1002, "用户信息无效")
|
|
return
|
|
}
|
|
|
|
// 检查权限
|
|
hasPermission, err := auth.Permission.CheckUserPermission(r.Context(), userIdInt, permissionCode)
|
|
if err != nil {
|
|
g.Log().Errorf(r.Context(), "权限检查失败: %v", err)
|
|
response.Error(r, 1004, "权限检查失败")
|
|
return
|
|
}
|
|
|
|
if !hasPermission {
|
|
response.Error(r, 1004, "没有访问权限")
|
|
return
|
|
}
|
|
|
|
r.Middleware.Next()
|
|
}
|
|
}
|
|
|
|
// SuperAdminMiddleware 超级管理员权限验证中间件
|
|
func SuperAdminMiddleware(r *ghttp.Request) {
|
|
// 获取Token
|
|
token := r.Header.Get("Authorization")
|
|
if token == "" {
|
|
response.Error(r, 1002, "请先登录")
|
|
return
|
|
}
|
|
|
|
// 移除Bearer前缀
|
|
if strings.HasPrefix(token, "Bearer ") {
|
|
token = strings.TrimPrefix(token, "Bearer ")
|
|
}
|
|
|
|
// 验证Token
|
|
claims, err := jwt.ParseToken(token)
|
|
if err != nil {
|
|
response.Error(r, 1003, "Token无效")
|
|
return
|
|
}
|
|
|
|
// 检查是否为超级管理员
|
|
role := claims.UserType
|
|
if role != "super_admin" {
|
|
response.Error(r, 1004, "需要超级管理员权限")
|
|
return
|
|
}
|
|
|
|
r.Middleware.Next()
|
|
} |