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" "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) } 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 }