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/store/getStoreInfoByNetbar", "GET", "根据网关账号获取门店信息") // 任务 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/store/area", "GET", "获取门店区域列表") enforcer.AddPolicy("store", "/x/store/netfeeSetting", "GET", "获取门店网费设置") enforcer.AddPolicy("store", "/x/store/netfeeSetting", "POST", "修改门店网费设置") // 门店:修改 enforcer.AddPolicy("store", "/x/task/sync", "POST", "同步任务") enforcer.AddPolicy("store", "/x/store/detail", "GET", "获取门店详情") // 奖励类型 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/netfeeCallback", "POST", "网点充值回调") enforcer.AddPolicy("store", "/x/reward", "GET", "获取奖励列表") enforcer.AddPolicy("store", "/x/reward/internetCharge", "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/reward/netfeeList", "GET", "获取门店网费奖励信息列表") // 门店角色 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 }