Files
arenax-server/utility/myCasbin/casbin.go
2025-07-04 17:07:42 +08:00

209 lines
8.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package myCasbin
import (
"context"
"github.com/casbin/casbin/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/glog"
"github.com/hailaz/gf-casbin-adapter/v2"
"server/internal/consts"
"sync"
)
type myCasbin struct {
*casbin.Enforcer
}
var (
instance *myCasbin
once sync.Once
)
func init() {
ctx := context.Background()
once.Do(func() {
modelPath := g.Config().MustGet(ctx, "casbin.modelPath").String()
enforcer, err := casbin.NewEnforcer(modelPath, adapter.NewAdapter(
adapter.Options{
GDB: g.DB(),
FieldName: &adapter.FieldName{PType: "p_type"},
},
))
if err != nil {
glog.Errorf(ctx, "init casbin error: %v", err)
}
enforcer.LoadPolicy()
enforcer.AddGroupingPolicy(consts.UserRoleCode, consts.GuestRoleCode) // 用户继承游客角色权限
enforcer.AddGroupingPolicy(consts.StoreRoleCode, consts.UserRoleCode) // 门店继承用户角色权限
enforcer.AddGroupingPolicy(consts.MerchantRoleCode, consts.StoreRoleCode) // 商户继承门店角色权限
enforcer.AddGroupingPolicy(consts.AdminRoleCode, consts.MerchantRoleCode) // 管理员继承商户角色权限
// 游客
{
// 任务
enforcer.AddPolicy("guest", "/x/task/ranking", "GET", "获取排行榜")
enforcer.AddPolicy("guest", "/x/task/getNonLoginTaskList", "GET", "未登录获取任务列表")
enforcer.AddPolicy("guest", "/x/reward/callback", "POST", "tencent回调")
enforcer.AddPolicy("guest", "/x/task/list", "GET", "获取任务列表")
// 游戏列表
enforcer.AddPolicy("guest", "/x/game", "GET", "获取游戏列表")
enforcer.AddPolicy("guest", "/x/reward/callback", "POST", "tencent奖励回调")
enforcer.AddPolicy("user", "/x/reward/getLift", "POST", "tencent奖励领取")
enforcer.AddPolicy("guest", "/x/reward/goodsDetails", "POST", "获取物品详情")
}
// 用户
{
// 发送短信
enforcer.AddPolicy("user", "/x/sms/send", "POST", "发送短信")
// 上传图片
enforcer.AddPolicy("user", "/x/upload/image", "POST", "上传图片")
enforcer.AddPolicy("user", "/x/upload/user", "POST", "上传头像图片")
enforcer.AddPolicy("user", "/x/user", "PUT", "修改个人信息")
enforcer.AddPolicy("user", "/x/user/getPhoneCode", "POST", "获取验证码")
enforcer.AddPolicy("user", "/x/user/bindPhone", "POST", "绑定手机号")
enforcer.AddPolicy("user", "/x/user/info", "GET", "查询用户个人信息")
// 游戏人生
enforcer.AddPolicy("user", "/x/user/boundInfo", "GET", "查询用户绑定信息")
enforcer.AddPolicy("user", "/x/user/boundUrl", "GET", "获取用户绑定的URL")
enforcer.AddPolicy("user", "/x/user/unBoundUrl", "GET", "获取用户取消绑定的URL")
enforcer.AddPolicy("user", "/x/user/gameRoleList", "GET", "查询用户游戏角色列表")
enforcer.AddPolicy("user", "/x/user/packageUrl", "GET", "获取用户游戏人生背包url")
// 反馈信息
enforcer.AddPolicy("user", "/x/feedback", "GET", "获取反馈信息列表")
enforcer.AddPolicy("user", "/x/feedback", "POST", "添加反馈信息")
enforcer.AddPolicy("user", "/x/feedback", "PUT", "更新反馈信息")
enforcer.AddPolicy("user", "/x/feedback/*", "PUT", "反馈信息处理")
//enforcer.AddPolicy("user", "/x/feedback/*", "DELETE", "删除反馈信息")*
enforcer.AddPolicy("user", "/x/feedback/*", "GET", "查询反馈详情")
// 任务
enforcer.AddPolicy("user", "/x/task/getLoginTaskList", "GET", "获取任务列表(已登录)")
enforcer.AddPolicy("user", "/x/task/get", "POST", "领取任务")
enforcer.AddPolicy("user", "/x/task/records", "GET", "获取任务记录列表")
// 奖励
enforcer.AddPolicy("user", "/x/reward/goods", "GET", "获取物品列表")
enforcer.AddPolicy("user", "/x/reward/canClaim", "GET", "获取该任务可领取奖励列表")
}
// 门店
{
// 获取会员
enforcer.AddPolicy("store", "/x/store/memberLevel", "GET", "获取用户会员信息")
// 门店:修改
enforcer.AddPolicy("store", "/x/task/sync", "POST", "同步任务")
// 奖励类型
enforcer.AddPolicy("store", "/x/rewardType", "GET", "获取奖励类型列表")
enforcer.AddPolicy("store", "/x/rewardType", "POST", "添加奖励类型")
enforcer.AddPolicy("store", "/x/rewardType", "PUT", "更新奖励类型")
enforcer.AddPolicy("store", "/x/rewardType/*", "DELETE", "删除奖励类型")
enforcer.AddPolicy("store", "/x/reward", "GET", "获取奖励列表")
enforcer.AddPolicy("store", "/x/reward", "POST", "添加奖励")
enforcer.AddPolicy("store", "/x/reward", "PUT", "更新奖励")
enforcer.AddPolicy("store", "/x/reward/*", "DELETE", "删除奖励")
enforcer.AddPolicy("store", "/x/reward/taskReward", "POST", "添加/删除门店任务奖励")
enforcer.AddPolicy("store", "/x/upload/reward", "POST", "上传奖励图片")
// 门店角色
enforcer.AddPolicy("store", "/x/store/role", "GET", "获取门店角色列表")
enforcer.AddPolicy("store", "/x/store/role", "POST", "添加门店角色")
enforcer.AddPolicy("store", "/x/store/role", "PUT", "更新门店角色")
enforcer.AddPolicy("store", "/x/store/role/*", "DELETE", "删除门店角色")
// 门店管理员(门店员工)
enforcer.AddPolicy("store", "/x/store/admin/info", "GET", "获取门店管理员信息")
enforcer.AddPolicy("store", "/x/store/admin", "GET", "获取门店管理员列表")
enforcer.AddPolicy("store", "/x/store/admin", "POST", "添加门店管理员")
enforcer.AddPolicy("store", "/x/store/admin", "PUT", "更新门店管理员")
enforcer.AddPolicy("store", "/x/store/admin/*", "DELETE", "删除门店管理员")
enforcer.AddPolicy("store", "/x/store/admin/password", "POST", "修改门店管理员密码")
// 门店桌面设置
enforcer.AddPolicy("store", "/x/desktop", "GET", "获取门店桌面设置")
enforcer.AddPolicy("store", "/x/desktop", "POST", "修改门店桌面设置")
enforcer.AddPolicy("store", "/x/task/completed/list", "GET", "门店获取用户任务完成情况")
// 获取门店 ip信息
enforcer.AddPolicy("store", "/x/store/getIpList", "GET", "获取门店 ip信息列表")
enforcer.AddPolicy("store", "/x/store/addIp", "POST", "添加ip信息")
enforcer.AddPolicy("store", "/x/store/del/*", "DELETE", "删除门店 ip信息")
enforcer.AddPolicy("store", "/x/store/updateIp", "PUT", "修改门店 ip信息")
// statistics
enforcer.AddPolicy("store", "/x/statistic/onlineDevice", "GET", "获取门店在线设备列表")
}
// 商户
{
enforcer.AddPolicy("merchant", "/x/store", "GET", "根据商户 id 获取门店列表")
enforcer.AddPolicy("merchant", "/x/merchant/info", "GET", "获取商户信息")
}
// 管理员
{
// admin
enforcer.AddPolicy("admin", "/x/admin/info", "GET", "获取管理员用户信息")
enforcer.AddPolicy("admin", "/x/upload/game", "POST", "管理员上传游戏图标")
//
enforcer.AddPolicy("store", "/x/user/list", "GET", "获取用户列表信息")
// role
enforcer.AddPolicy("admin", "/x/role", "GET", "管理员获取角色列表")
enforcer.AddPolicy("admin", "/x/role", "POST", "管理员添加角色")
enforcer.AddPolicy("admin", "/x/role", "PUT", "管理员更新角色")
enforcer.AddPolicy("admin", "/x/role", "DELETE", "管理员给角色分配权限")
enforcer.AddPolicy("admin", "/x/role/*", "DELETE", "管理员删除单个角色")
// merchant
enforcer.AddPolicy("admin", "/x/merchant", "GET", "管理员获取商户列表")
enforcer.AddPolicy("admin", "/x/merchant/audit", "POST", "管理员审核商户申请")
enforcer.AddPolicy("admin", "/x/game", "POST", "管理员添加游戏")
enforcer.AddPolicy("admin", "/x/game/*", "DELETE", "管理员删除游戏")
enforcer.AddPolicy("admin", "/x/game", "PUT", "管理员更新游戏")
// 任务
enforcer.AddPolicy("admin", "/x/task/selector", "GET", "管理员获取任务列表二级选择器")
// 用户:删除
enforcer.AddPolicy("admin", "/x/user/del/*", "DELETE", "删除用户")
}
instance = &myCasbin{Enforcer: enforcer}
})
glog.Infof(ctx, "init casbin success")
}
func GetMyCasbin() *myCasbin {
if instance == nil {
panic("casbin not init")
}
return instance
}
// HasPermission 判断给定的权限标识是否拥有访问指定 URL 和方法的权限。
//
// 参数:
// - permission: 权限标识(如角色名或用户 ID
// - url: 请求的路径(如 "/api/user/list"
// - method: HTTP 请求方法(如 "GET", "POST"
//
// 返回:
// - access: 如果有权限则为 true否则为 false。
// - 若校验过程中发生错误,将记录日志并返回 false。
func (m *myCasbin) HasPermission(permission, url, method string) (access bool) {
enforce, err := m.Enforcer.Enforce(permission, url, method)
if err != nil {
glog.Errorf(context.Background(), "enforce error: %v", err)
return
}
return enforce
}