博客详情

自己封装权限表达式(类似于shiro) (原创)

作者: 朝如青丝暮成雪
发布时间:2020-11-04 11:18:34  文章分类:java编程   阅读(933)  评论(0)

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



关键字:  权限表达式  PermExp
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号