大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
beego中怎么利用casbin实现权限管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
为湖南等地区用户提供了全套网页设计制作服务,及湖南网站建设行业解决方案。主营业务为成都网站建设、做网站、湖南网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!策略更新包含用户角色更新,用户或角色的权限更新。casbin的rbac_api.go和management_api.go中的方法,似乎分成几个“层次”:比如addrole和addpermission,这种专用的;AddNamedPolicy类似这种通用的。
再比如GetPermissionsForUser,它不同于enforce(),后者能够实现:user属于role,user具备访问data1的权限,role具备访问data2的权限,此时用enforce(user,data2),结果是true,但是用GetPermissionsForUser(user),它取不到role的data2。 只能用 先取出user的所有角色,再循环,取出每个角色具备的权限。
[plain] view plain copy
roles := e.GetRolesForUser(useridstring) //取出用户的所有角色
for , w := range roles {
roleRes = e.GetPermissionsForUser(w) //取出角色的所有权限
for, k := range roleRes {
言归正传,策略修改总的思路应该是这样:
1.要更新一个用户的角色,先把这个用户的角色全部删掉,然后重新添加这个用户的角色。
2.更新用户(或角色)的权限,先把这个用户对于某个文件的权限全部删掉,再重新添加,道理一样。
首先是用户和角色的修改:下图,点击用户,下面显示这个用户具有的角色,并勾选上。
当修改勾选后,再保存,后端先用e.DeleteRolesForUser(uid)将这个用户的所有角色删除。再根据前段选中的传入后端进行循环添加。
[plain] view plain copy
//添加用户角色
//先删除用户所有角色
func (c *RoleController) UserRole() {
//要支持批量分配角色,循环用户id
uid := c.GetString("uid") //secofficeid
//先删除用户的权限
e.DeleteRolesForUser(uid) //数据库没有删掉!
//删除数据库中角色中的用户
o := orm.NewOrm()
qs := o.QueryTable("casbinrule")
, err := qs.Filter("PType", "g").Filter("v0", uid).Delete()
if err != nil {
beego.Error(err)
}
//再添加,如果没有选择,相当于删除了全部角色
ids := c.GetString("ids") //roleid
if ids != "" {
array := strings.Split(ids, ",")
for , v1 := range array {
e.AddGroupingPolicy(uid, "role"+v1)
//应该用AddRoleForUser()//rbac_api.go
}
} c.Data["json"] = "ok" c.ServeJSON()
}
onlyoffice中对于某个文档的权限更新
选中一个文档,点击权限按钮,显示这个文档的用户、角色和对应的权限。
对于/onlyoffice/26这个文档,当删除或增加用户、角色后,传到后台,先用RemoveFilteredPolicy删掉所有的CasbinRul表中v1为/onlyoffice/26的策略。
然后再根据传过来的策略重新存入。因为这里是把用户和角色放在一个表格里,所以要做一下区分,角色id加上role_字样,以示区别。
[plain] view plain copy
e.RemoveFilteredPolicy(1, "/onlyoffice/"+strconv.FormatInt(attachments[0].Id, 10))
:= orm.NewOrm()
qs := o.QueryTable("casbinrule")
, err = qs.Filter("v1", "/onlyoffice/"+strconv.FormatInt(attachments[0].Id, 10)).Delete()
if err != nil {
beego.Error(err)
}
/再添加permission
for , v1 := range rolepermission {
// beego.Info(v1.Id)
if v1.Rolenumber != "" { //存储角色id
success = e.AddPolicy("role"+strconv.FormatInt(v1.Id, 10), "/onlyoffice/"+strconv.FormatInt(attachments[0].Id, 10), v1.Permission, suf)
} else { //存储用户id
success = e.AddPolicy(strconv.FormatInt(v1.Id, 10), "/onlyoffice/"+strconv.FormatInt(attachments[0].Id, 10), v1.Permission, suf)
}
//这里应该用AddPermissionForUser(),来自casbin\rbac_api.go
}
RemovePolicy和RemoveGroupingPolicy可以根据自己的场景来使用。
上面例子,本来用casbin的方法,删除了内存中的策略,相应的它会自动删除数据库中的数据,但是暂时解决不了,导致数据库的数据不会自动删除,所以分别添加了一段代码,用于删除数据库数据。
casbin用于判断用户的的权限是很方便的。但由于场景很多,比如有时候要显示一个登录用户对各个资源的的权限(下图):
有时管理员要知道一个资源所有的用户和角色,并对应拥有的权限,如下图。
还有个几个常见的问题:
1.用户的权限permission(action)用1、2、3、4来表示还是用get,post,……因为有时候要分等级和优先,如果再加一个字段不一定需要。比如,对于一个文档,全部权限规定为1,评论为2,只读为3,不允许为4。设置权限的时候,直接给这个用户设置权限为只读3,而这个用户属于角色role,这个role对这个文档权限是1,那这个用户应该是大权限优先。所以用1234比较合适,转成int后可以做比对,取最小的。
2.casbin对于admin应该没有特殊的处理吧,和普通角色一样来设置吧。
3.另外casbin对于ip区段支持。这个我以前还在网上找了一段ip区段处理的代码,好像是某个ip扫描器代码,先把区段变成一个个ip,对应端口号,然后写入map,在内存中。竟然类似casbin的方式。
接下来有个不成熟的想法:把casbin的example里的conf和csv一一对应地放到一个文件中,加上注释,可能的话配上增删改等方法。这样方便初学者能够直接进入例子,或者自己的场景能直接在这里找到例子。另外就是一些casbin的思想,我都是东拼西凑理解的,并非代表官方思路,它的处理手段背后为啥要这样?
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。