52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package services
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
|
|
"server/models"
|
|
)
|
|
|
|
// CheckUserPermission 校验用户是否拥有指定权限标识。
|
|
// 兼容 rights 为 JSON 数组 / 逗号分隔字符串;解析失败时默认放行,避免历史数据阻断请求。
|
|
func CheckUserPermission(userID int, permission string) (bool, error) {
|
|
if permission == "" || userID <= 0 {
|
|
return true, nil
|
|
}
|
|
|
|
var user models.AdminUser
|
|
if err := models.Orm.QueryTable(new(models.AdminUser)).Filter("id", userID).One(&user); err != nil {
|
|
return false, err
|
|
}
|
|
|
|
var role models.AdminRole
|
|
if err := models.Orm.QueryTable(new(models.AdminRole)).Filter("id", user.RoleID).One(&role); err != nil {
|
|
return false, err
|
|
}
|
|
if role.Rights == nil || strings.TrimSpace(*role.Rights) == "" {
|
|
return true, nil
|
|
}
|
|
rightsRaw := strings.TrimSpace(*role.Rights)
|
|
|
|
// 1) JSON 数组格式
|
|
var arr []string
|
|
if err := json.Unmarshal([]byte(rightsRaw), &arr); err == nil {
|
|
for _, p := range arr {
|
|
if strings.TrimSpace(p) == permission {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
// 2) 逗号分隔字符串
|
|
for _, p := range strings.Split(rightsRaw, ",") {
|
|
if strings.TrimSpace(p) == permission {
|
|
return true, nil
|
|
}
|
|
}
|
|
|
|
return false, nil
|
|
}
|
|
|