您现在的位置是:首页 > 正文

Casbin之自定函数

2024-01-30 20:54:17阅读 0

Casbin之自定函数

1.讲解

image-20220217121036902

2.model.conf文件



[request_definition]
r = sub,obj,act


[policy_definition]
p = sub,obj,act


[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && my_func(r.obj, p.obj) && r.act == p.act


3.Policy.csv文件

p, dajun, data/*, read

4.main

package main

import (
	"fmt"
	"github.com/casbin/casbin/v2"
	"log"
	"strings"
)

//我们当然也可以定义自己的函数。先定义一个函数,返回 bool:
func KeyMatch(key1, key2 string) bool {
	i := strings.Index(key2, "*")
	if i == -1 {
		return key1 == key2
	}

	if len(key1) > i {
		return key1[:i] == key2[:i]
	}

	return key1 == key2[:i]
}

//然后将这个函数用interface{}类型包装一层:
func KeyMatchFunc(args ...interface{}) (interface{}, error) {
	name1 := args[0].(string)
	name2 := args[1].(string)

	return (bool)(KeyMatch(name1, name2)), nil
}
func check(e *casbin.Enforcer, sub, obj, act string) {
	ok, _ := e.Enforce(sub, obj, act)
	if ok {
		fmt.Printf("%s CAN %s %s\n", sub, act, obj)
	} else {
		fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
	}
}
func main() {
	e, err := casbin.NewEnforcer("./casbin/model.conf", "./casbin/policy.csv")
	//然后添加到权限认证器中:
	e.AddFunction("my_func", KeyMatchFunc)
	if err != nil {
		log.Fatalf("NewEnforecer failed:%v\n", err)
	}

	check(e, "dajun", "data/1", "read")
	check(e, "dajun", "data/2", "read")
	check(e, "dajun", "data/1", "write")
	check(e, "dajun", "mydata", "read")
}

5.输出及结构

image-20220217121202150

网站文章

  • epoll总结

    Epoll epoll操作由三个函数构成:头文件为 #include #include int epoll_create(int size); int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(in...

    2024-01-30 20:54:10
  • 在Linux和Windows上安装sentinel-1.8.5

    在Linux和Windows上安装sentinel-1.8.5

    记录:380 场景:在CentOS 7.9操作系统上,安装sentinel-1.8.5。在Windows上操作系统上,安装sentinel-1.8.5。Sentinel是面向分布式、多语言异构化服务架构的流量治理组件。

    2024-01-30 20:54:03
  • 使用 sqoop从MySQL增量导出数据到hive

    使用 sqoop从MySQL增量导出数据到hive

    本文主要解释incremental参数下append模式和lastmodified模式的区别,想要了解具体其他参数请参考官方文档: http://sqoop.apache.org/docs/1.4.6...

    2024-01-30 20:53:33
  • 完美实现SpringBoot+Angular普通登录

    完美实现SpringBoot+Angular普通登录

    编辑:业余草来源:https://www.xttblog.com/?p=4881零本文基于《SpringBoot+Angular入门实例教程》第5.1节...

    2024-01-30 20:53:28
  • 交换-STP

    交换-STP

    2024-01-30 20:53:22
  • 有关《函数模板》的那些小知识-.-

    有关《函数模板》的那些小知识-.-

    本文介绍函数模板的概念、用途以及如何创建函数模板和函数模板的使用方法......函数模板定义的一般形式如下:之前我们知道的交换两个变量的方法有宏定义、函数,这两种方式都能实现两个变量的交换,但是各有各...

    2024-01-30 20:53:16
  • 辗转相除法求最大公约数

    辗转相除法求最大公约数

    由此可见,a和b都是d的倍数,所以d是a和b的最大公因数(最大是因为我们在第3步时就停止了分割线段,此时恰好整除,所以是最大)我们以及对求最大公因数有了形象上的了解,那么下面要做的就是将其写成代码。最...

    2024-01-30 20:52:47
  • Spring生命周期讲的比较好的文章

    https://www.jianshu.com/p/1dec08d290c1我画的流程图,参照:https://www.processon.com/view/link/5f915d30e401fd06fd9c0b96

    2024-01-30 20:52:35
  • html关系选择符,CSS关系选择器和属性选择器

    html关系选择符,CSS关系选择器和属性选择器

    1.1. 关系选择器关系选择器是通过元素之间的“位置关系的特征”来确定所选元素。1.1.1. 子代选择器:S1>S2语法:选择器1>选择器2匹配S1中的下一级S2。下一级就是“子级”,或子代。其中S1,S2都可以是独立使用的选择器(比如id选择器,class选择器,标签选择器等)。1.1.2. 后代选择器:S1 S2语法:选择器1 选择器2【派生选择器】匹配S1内部的所有后代S2。...

    2024-01-30 20:52:05
  • 本地MySQL数据库其他电脑局域网访问

    本地MySQL数据库其他电脑局域网访问

    一般情况下是访问不了的 ,需要改两个地方首先查看局域网本地ipipconfig第一步首先本地用 Navicat 本地连接 打开数据库 (MySQL)/user表把user字段为root的 Host字段改成%第二步打开Windows防火墙 点击高级设置步骤阅读点击进去 点入站规则在点击新建规则选择端口 进行下一步填入330...

    2024-01-30 20:52:00