神一样的少年就是我 2021-03-06 23:15 采纳率: 50%
浏览 130
已采纳

怎么判断字符串数组是否匹配访问策略树?

policy:="((student AND CS) OR (teacher AND xidian)) OR male"

attributes := []string{"student", "xidian", "CS", "male"}

如图,policy为包含与或门的访问策略树,attributes是属性集合,如何判断属性是否符合访问控制树呢?有没有相关的算法思想呢?当然有代码就更好了,最好是golang。急,有偿!

很明显在此例中是匹配策略树的。

  • 写回答

5条回答 默认 最新

  • ProfSnail 2021-03-07 14:31
    关注

    搞了一整上午,终于搞出来个Go版本的。 

    package main
    
    import (
    	"fmt"
    	"regexp"
    )
    
    type node struct {
    	option string
    	str    string
    	left   *node
    	right  *node
    }
    
    func judgeTrue(root *node, maps map[string]bool) bool {
    	if root.option != "" {
    		if root.option == "AND" {
    			return judgeTrue(root.left, maps) && judgeTrue(root.right, maps)
    		} else {
    			return judgeTrue(root.left, maps) || judgeTrue(root.right, maps)
    		}
    	} else {
    		_, ok := maps[root.str]
    		return ok
    	}
    }
    
    func buildDecisionTree(policy string) *node {
    	ra := `^\((.*)\){1}\s+(AND|OR){1}\s+\((.*)\){1}$`
    	rb := `^([^\(\)]*){1}\s+(AND|OR){1}\s+\((.*)\){1}$`
    	rc := `^\((.*)\){1}\s+(AND|OR){1}\s+([^\(\)]*){1}$`
    	rd := `^([^\(\)]*){1}\s+(AND|OR){1}\s+([^\(\)]*){1}$`
    	rlist := []string{ra, rb, rc, rd}
    	var i int
    	var flag bool = false
    	var left, option, right string
    	for i = 0; i < 4; i++ {
    		regTemp := regexp.MustCompile(rlist[i])
    		result := regTemp.FindAllStringSubmatch(policy, -1)
    		if len(result) > 0 {
    			left = regTemp.ReplaceAllString(policy, "$1")
    			option = regTemp.ReplaceAllString(policy, "$2")
    			right = regTemp.ReplaceAllString(policy, "$3")
    			flag = true
    		}
    	}
    	var root *node = &node{}
    	if flag{
    		root.left = buildDecisionTree(left)
    		root.option = option
    		root.right = buildDecisionTree(right)
    	}else{
    		root.str = policy
    	}
    	return root
    }
    
    func getMaps(inputList []string) map[string]bool{
    	var maps map[string]bool = make(map[string]bool)
    	for index:=range(inputList){
    		maps[ inputList[index] ] = true
    	}
    	return maps
    }
    
    func main() {
    	var policy string = "((student AND CS) OR (teacher AND xidian)) OR male"
    	root:=buildDecisionTree(policy)
    	attributes := []string{"student", "xidian", "CS", "male"}
    	maps:=getMaps(attributes)
    	ans:=judgeTrue(root, maps)
    	fmt.Println(ans)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划