shiro是个不错的权限框架,其中笔者比较感兴趣的是shiro的权限表达式的实现 。但有时候笔者不想引入整个shiro框架,只想使用下其中的权限表达式做权限判断。
shiro的权限表达式,例如
user ( 等价于 user:*) 表示对user资源有全部操作权限
user:add 表示对user资源有add的操作权限
user:update 表示对user资源有update的操作权限
user:delete 表示对user资源有delete的操作群星
*:select 表示对所有资源有select (查询)的权限
user:xiaoming:select 表示对xiaoming这个user资源有select权限
有鉴于此,笔者自己封装实现了一套权限表达式。整体合计思路如下:
1、对于每个资源或操作,封装为一个Element对象, element的内容可以为普通字符串或通配符(*),通配符表示匹配所有资源或所有操作。
2、对element的权限的判断逻辑封装为PermExp表达式对象, PermExp中有个静态方法可以将权限表达式字符串转为为权限表达式对象。
具体实现如下:
1、Element类
/** * 权限元素 */ public class Element { public static final String wildcard="*"; private String chars=""; public Element(String chars) { this.chars = chars; } /** * 判断是否满足给定的元素 * @param that * @return */ public boolean meet(Element that){ if(chars.equals(wildcard)){ return true ; }else{ return this.chars.equals(that.chars); } } @Override public String toString() { return chars.toString(); } }
2、PermExp 权限表达式类
import java.util.ArrayList; import java.util.List; /** * 权限表达式 */ public class PermExp { public static final String spacer=":"; private List<Element> elements=new ArrayList<>(); /** * 判断是否满足条件 * @param that * @return */ public boolean meet(PermExp that){ //遍历this中的elements int len =this.elements.size(); for(int i=0;i<len;i++){ Element a = this.elements.get(i); Element b = that.elements.get(i); if(!a.meet(b)){ return false; } } return true ; } /** * 解析字符串为exp表达式对象 * @param expStr * @return */ public static PermExp parse(String expStr){ PermExp exp= new PermExp(); String[] ss= expStr.split(spacer); for(String s: ss){ exp.addElement(new Element(s)); } return exp; } /** * 添加element元素 * @param element * @return */ public PermExp addElement(Element element){ elements.add(element); return this; } /** * 移除element元素 * @param index * @return */ public PermExp removeElement(int index){ elements.remove(index); return this; } /** * 转化为表达式字符串语句 * @return */ public String toExpString(){ if(elements==null ||elements.size()==0){ return ""; } StringBuilder sb=new StringBuilder(); for(Element ele: elements){ sb.append(ele.toString()).append(spacer); } return sb.substring(0,sb.lastIndexOf(spacer)); } @Override public String toString(){ return toExpString(); } }
3、测试程序
public class PermExpTest { @Test public void test1(){ Element ele1= new Element("system"); Element ele2= new Element("user"); Element ele3= new Element("add"); PermExp exp= new PermExp(); String s= exp.addElement(ele1).addElement(ele2).addElement(ele3).toExpString(); System.out.println(s);//system:user:add } @Test public void test2(){ String expStr="system:add"; String[] ss= expStr.split(":"); System.out.println(Arrays.toString(ss)); } @Test public void test3(){ Element ele1=new Element("*"); Element ele2=new Element("assd:aaasdf:ddd"); System.out.println(ele1.meet(ele2));//*匹配所有,所以为true } @Test public void test4(){ // *:add PermExp exp=new PermExp().addElement(new Element("*")).addElement(new Element("add")); PermExp exp2=PermExp.parse("user:add"); PermExp exp3=PermExp.parse("user:update"); PermExp exp4=PermExp.parse("user:select"); PermExp exp5=PermExp.parse("role:add"); System.out.println("匹配吗:"+exp.meet(exp2));//true System.out.println("匹配吗:"+exp.meet(exp3));//false System.out.println("匹配吗:"+exp.meet(exp4));//false System.out.println("匹配吗:"+exp.meet(exp5));//true System.out.println(exp.toString()); } }
ok
Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1