神一样的少年就是我 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 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab