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("user", "/x/feedback", "GET", "获取反馈信息列表") enforcer.AddPolicy("user", "/x/feedback", "POST", "添加反馈信息") enforcer.AddPolicy("user", "/x/feedback", "PUT", "更新反馈信息") //enforcer.AddPolicy("user", "/x/feedback/*", "DELETE", "删除反馈信息")* enforcer.AddPolicy("user", "/x/feedback/*", "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", "删除奖励类型") } // 管理员 { // admin enforcer.AddPolicy("admin", "/x/admin/info", "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", "管理员审核商户申请") } 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 }