最近一直在学习Vue3相关的技术栈,包括CompositionAPI、TypeScript、vite、ElementUIforVue3支持的版本ElementPlus。所以想用Vue3写一个简单的RBAC用户权限系统。我之前一直在使用MySQL作为关系数据库。刚好最近在学习KongGateway的时候,接触到了Postgres这个关系型数据库,还看到一句话,说:“MySQL是目前使用最广泛的数据库,但Postgres是目前最先进的数据库。”当然,这个最先进的也是Postgres这个开源组织标榜的。但是对于我来说,Postgres似乎比MySQL好用,至少在数据类型支持方面,是非常好的一点。我经常用Json或者Array字段,Postgres支持的很好,当然MySQL5.7以后也支持Json字段,但是在性能和??使用上,我还是觉得Postgres好一些,我对MySQL了解不深好了,废话不多说,实际来看项目,这个项目不管前后端都不会过度封装,不该打包的包就不打包,代码也不打包为X过度封装,减少大家看代码的时间成本Demo站点:http://fdevops.com:8088github:https://github.com/lanyulei/sky,如果觉得还可以,请别吝啬你的指尖,点个星吧,系统由Casbin权限控制,以Casbin为autho接口的权限管理依赖,使用RBAC进行管理,支持用户多角色绑定。Casbin模型文件内容如下:[request_definition]r=sub,obj,act[policy_definition]p=sub,obj,act[role_definition]g=_,_[policy_effect]e=some(where(p.eft==allow))[matchers]m=g(r.sub,p.sub)&&r.obj==p.obj&&r.act==p.act其实就是上面给出的RBAC模型的内容卡斯宾官网。如果需要使用来定义函数,可以参考官网自行添加。https://casbin.org/docs/zh-CN...CasbinGin中间件的简单包装器。包权限导入("sky/pkg/conn""sky/pkg/logger""sky/pkg/tools/response""time""github.com/casbin/casbin/v2"gormAdapter"github.com/casbin/gorm-adapter/v3""github.com/gin-gonic/gin""github.com/spf13/viper")varEnforcer*casbin.SyncedEnforcerfuncCasbinSetup()*casbin.SyncedEnforcer{var(err错误适配器*gormAdapter.Adapter)adapter,err=gormAdapter.NewAdapterByDBWithCustomTable(conn.Orm,nil,viper.GetString("casbin.tableName"))iferr!=nil{logger.Fatal("无法创建casbingorm适配器,错误:%v",err)}Enforcer,err=casbin.NewSyncedEnforcer(viper.GetString("casbin.rbacModel"),adapter)iferr!=nil{logger.Fatal("无法创建casbinenforcer,错误:%v",err)}err=Enforcer.LoadPolicy()iferr!=nil{logger.Fatal("Failedtoloadpolicyfromdatabase,error:%v",err)}//定时同步策略ifviper.GetBool("casbin.isTiming"){//同步权限策略的时间间隔,单位:秒Enforcer.StartAutoLoadPolicy(time.Second*time.Duration(viper.GetInt("casbin.intervalTime")))}returnEnforcer}funcCheckPermMiddleware()gin.HandlerFunc{returnfunc(c*gin.Context){//获取资源obj:=c.Request.URL.Path//获取方法act:=c.Request.Method//获取实体sub:=c.GetString("username")isAdmin:=c.GetBool("isAdmin")ifisAdmin{c.Next()}else{//判断是否有策略ifok,_:=Enforcer.Enforce(sub,obj,act);ok{c.Next()}else{response.Error(c,nil,response.NoPermissionError)c.Abort()}}}}菜单权限菜单可以控制角色可访问的菜单标识的权限,使得多个菜单标识符可以按如下方式路由:{path:'/user',name:'User',component:()=>import('/@/views/user/list.vue'),meta:{title:'UserList',auth:['system:user:list']//这个是RoutingID,只有角色关联到这个ID才能访问到。},}检查当前用户是否有权限,用户的权限标识列表会存储在Vuex中。当前系统为用户定义了超级管理员的概念,所以当程序为超级管理员时,直接释放。导出函数setFilterRoute(chil:any){让filterRoute:any=[];chil.forEach((route:any)=>{if(route.meta.auth){route.meta.auth.forEach((metaAuth:any)=>{store.state.userInfos.userInfos.authPageList.forEach((auth:any)=>{//如果你是超级管理员,直接passif(store.state.userInfos.userInfos.is_admin||metaAuth===auth)filterRoute.push({...route});});});}});returnfilterRoute;}项目演示菜单管理、菜单创建、页面元素创建和菜单绑定API接口。将API接口与菜单绑定,方便接口权限管理。页面元素管理,包括但不限于按钮。接口管理,所有需要通过Casbin校验的后端接口。授权角色。截图内容只是部分功能,您可以访问演示站点查看详细内容。有问题可以在这里留言讨论,https://www.fdevops.com。
