前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >beego利用casbin进行权限管理——第三节 策略查询

beego利用casbin进行权限管理——第三节 策略查询

作者头像
hotqin888
发布2018-09-11 15:07:29
1.5K0
发布2018-09-11 15:07:29
举报
文章被收录于专栏:hotqin888的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1334534

上一节讲到存储策略。其实我犯了个错,应该用rbac_api.go中的现成的方法。如下2段代码替换上节。不过我没测试。

代码语言:javascript
复制
success = e.AddPolicy(v1, projurl, action, suf)
				//这里应该用AddPermissionForUser(),来自casbin\rbac_api.go
代码语言:javascript
复制
e.AddGroupingPolicy(uid, v1)
		//应该用AddRoleForUser()

这次结合bootstrap treeview来做一下角色的权限查询。

如下图,选中一个角色,选中一个权限,然后查出文件夹,并选中。很直观。

代码语言:javascript
复制
package controllers

import (
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/casbin/beego-orm-adapter"
	"github.com/casbin/casbin"
	_ "github.com/mattn/go-sqlite3"
	"path"
	"regexp"
	"strconv"
	"strings"
)

下面应该用casbin自己的方式查询,查询的是内存(map),应该避免采用直接数据库查询。比如management_api.go中的GetFilteredPolicy()方法,它还支持多字段查询:e.GetFilteredPolicy(1, projectid/*,"GET")——第一个参数是第一个字段的开始索引号,第二个字段及后续字段按次序排,不用索引。但是它这个字段是相等,或符合正则,如果规则是包含,而不是相等关系要专门写代码去查询数据库了,如下。另外,和getpermission方法一样,不支持继承推断。只有enforce支持用户,用户角色,角色的角色等推断。

代码语言:javascript
复制
//查询角色所具有的权限对应的项目目录
func (c *RoleController) GetRolePermission() {
	roleid := c.GetString("roleid") //角色id
	action := c.GetString("action")
	projectid := c.GetString("projectid")
	beego.Info(roleid)
	beego.Info(action)
	beego.Info(projectid)
	myRes := e.GetPermissionsForUser(roleid)
	beego.Info(myRes)
	// 	2018/01/03 21:42:15 [I] [roleControllers.go:543] [[1 /25001/* POST .*] [1 /25001
	// /* PUT .*] [1 /25001/* DELETE .*] [1 /25001/* GET .*] [1 /25001/25003/* GET (?i:
	// PDF)] [1 /25001/25002/25013/* GET (?i:PDF)] [1 /25001/25002/25012/* GET (?i:PDF)
	// ] [1 /25001/25002/25011/* GET (?i:PDF)] [1 /25001/* GET (?i:PDF)] [1 /25001/2500
	// 4/* POST .*]]

	var paths []beegoormadapter.CasbinRule//上面导入了这个包
	o := orm.NewOrm()
	qs := o.QueryTable("casbin_rule")
	_, err := qs.Filter("PType", "p").Filter("v0", roleid).Filter("v1__contains", projectid).Filter("v2", action).All(&paths)
	if err != nil {
		beego.Error(err)
	}
	// beego.Info(paths)
	var projids []string
	for _, v1 := range paths {
		projid := strings.Replace(v1.V1, "/*", "", -1)
		projids = append(projids, path.Base(projid))
	}
	//beego.Info(projids)
	c.Data["json"] = projids
	c.ServeJSON()
}

前端bootstrap treeview收到这个pathid后,将目录选中,连带下级联动,父级联动。

代码语言:javascript
复制
$.ajax({  //JQuery的Ajax  
            type: 'GET',    
            dataType : "json",//返回数据类型  
            // async:false, //同步会出现警告:Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience 
            url: "/admin/role/getpermission",//请求的action路径  
            data: {roleid:row.Id,action:action,projectid:projectid}, 
             //同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行  
            error: function () {//请求失败处理函数    
                alert('请求失败');    
            },  
            success:function(data){ //请求成功后处理函数。取到Json对象data
              // var findCheckableNodess = function() {
              //   return $('#tree').treeview('search', [ data, { ignoreCase: false, exactMatch: true } ]);//忽略大小写——这个只支持名称
              // };
              $('#tree').treeview('uncheckAll', { silent: true });
              for(var i=0;i<data.length;i++){
                // alert(data[i]);
                var findCheckableNodess = function() {
                  return $('#tree').treeview('findNodes', [data[i], 'id']);
                }; 
                var checkableNodes = findCheckableNodess();
                // $('#tree').treeview('checkNode', [ checkableNodes, { silent: true } ]);
                $('#tree').treeview('toggleNodeChecked', [ checkableNodes, { silent: true } ]);
              }
            }
          });

查询到了对应的目录后,就是修改了,将勾选的取消,将没勾选的勾选上,然后保存……要和map中的权限做对比,哪些是增加,哪些是删除。思路是直接删除map中的(remove方法),然后重新添加,避免了比对,简单粗暴,下节吧。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年01月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档