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