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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/details/78992250

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

success = e.AddPolicy(v1, projurl, action, suf)
				//这里应该用AddPermissionForUser(),来自casbin\rbac_api.go
e.AddGroupingPolicy(uid, v1)
		//应该用AddRoleForUser()

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

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

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支持用户,用户角色,角色的角色等推断。

//查询角色所具有的权限对应的项目目录
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后,将目录选中,连带下级联动,父级联动。

$.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方法),然后重新添加,避免了比对,简单粗暴,下节吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

NFS实现(双httpd + php-fpm + nfs + mysql 搭建discuz论坛)

NFS相关介绍 一、NFS简介 1. NFS(Network File System): NFS是一个文件共享协议, 也是是在类Unix系统中在内核中实现的文件...

3677
来自专栏小李刀刀的专栏

再战子域共享Cookie问题

昨天贾宁旨光临寒舍,吃过晚饭回来后就跟他聊天,后来又玩了一会儿《Black Hawk Down》对战,到了大概晚上11点多,开始继续尝试用 Response.C...

4995
来自专栏恰童鞋骚年

.NET Core微服务之基于Consul实现服务治理(续)

上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧。

1705
来自专栏禅林阆苑

利用NextCloud配置私有云 【原创】

利用NextCloud配置私有云 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github...

2.4K8
来自专栏锦小年的博客

Linux使用笔记2-screen的妙用(保留端口会话)

现在一般都是用Windows通过ssh连接到linux,有时候工作到兴起,断网了、或者重启了,这时候一切都完了,重新连接也不能回到以前的会话。那么有没有一种可能...

1928
来自专栏IT技术精选文摘

Redis配置模板及持久化解决方案

本文根据贵金属使用Redis的经验,整理了Redis服务端配置模板、哨兵配置模板、监控项部署、持久化解决方案、Jedis客户端连接池配置说明,旨在减少大家在使用...

3063
来自专栏跟着阿笨一起玩NET

sql转Linq的工具

这些天写Linq挺烦人的,就上网搜搜可有什么好的sql转Linq的工具,咦,马上就看上了Linqer。

5193
来自专栏数据和云

【12.2新特性】在Oracle Active Data Guard上部署列式存储

摘要:本文将介绍Oracle 12.2中关于ADG的新特性,在ADG上部署列式存储。关于12.2更多新特性, 注:本文来自官方文档翻译。 一、In-Memory...

3056
来自专栏weixuqin 的专栏

Django 实现上传图片功能

  很多时候我们要用到图片上传功能,如果图片一直用放在别的网站上,通过加载网址的方式来显示的话其实也挺麻烦的,我们通过使用 django-filer 这个模块实...

1352
来自专栏张高兴的博客

张高兴的 UWP 开发笔记:应用内启动应用 (UWP Launch UWP)

3629

扫码关注云+社区

领取腾讯云代金券