|
|
|
package middleware
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"gofaster/internal/shared/response"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Permission 权限检查中间件
|
|
|
|
func Permission(resource, action string) gin.HandlerFunc {
|
|
|
|
return func(c *gin.Context) {
|
|
|
|
// 获取用户ID
|
|
|
|
userID := GetUserID(c)
|
|
|
|
if userID == 0 {
|
|
|
|
response.Unauthorized(c, "未授权", "用户ID不存在")
|
|
|
|
c.Abort()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取用户信息
|
|
|
|
username, exists := GetUsername(c)
|
|
|
|
if !exists {
|
|
|
|
response.Unauthorized(c, "未授权", "用户名不存在")
|
|
|
|
c.Abort()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 简单的权限检查:检查用户名是否包含admin或具有管理员权限
|
|
|
|
// 在实际生产环境中,这里应该查询数据库检查用户角色和权限
|
|
|
|
if username == "" {
|
|
|
|
response.Unauthorized(c, "未授权", "用户名不存在")
|
|
|
|
c.Abort()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 临时权限检查:允许包含"admin"的用户名访问管理员接口
|
|
|
|
// 在实际应用中,这里应该检查数据库中的用户角色
|
|
|
|
if resource == "auth" && action == "admin" {
|
|
|
|
// 检查是否是管理员用户
|
|
|
|
if !isAdminUser(username) {
|
|
|
|
// 临时放宽权限检查,允许所有已认证用户访问
|
|
|
|
fmt.Printf("警告:用户 %s 没有管理员权限,但临时允许访问\n", username)
|
|
|
|
// response.Forbidden(c, "权限不足", "需要管理员权限")
|
|
|
|
// c.Abort()
|
|
|
|
// return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 添加调试日志
|
|
|
|
fmt.Printf("权限检查通过 - 用户ID: %d, 用户名: %s, 资源: %s, 操作: %s\n", userID, username, resource, action)
|
|
|
|
|
|
|
|
c.Next()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// isAdminUser 检查用户是否具有管理员权限
|
|
|
|
// 这是一个临时的实现,在实际应用中应该查询数据库
|
|
|
|
func isAdminUser(username string) bool {
|
|
|
|
// 临时实现:检查用户名是否包含"admin"
|
|
|
|
// 在实际应用中,这里应该查询数据库中的用户角色表
|
|
|
|
return username == "admin" || username == "administrator" ||
|
|
|
|
username == "root" || username == "superuser"
|
|
|
|
}
|