一個簡單的URL訪問權限校驗


  前言

  安全框架,我們一般都會直接使用目前最流行的兩大安全框架:SpringSecruity、Shiro,但是有時候我們只想使用一些簡單的、底層的權限控制,不想要那么多攔截器/過濾器,這時候就需要一個簡單的權限校驗工具了

  權限控制,無非就是:前端控件是否可見、是否允許請求/訪問URL,本文分享一個簡單的URL訪問權限校驗,支持/、/*、/*/a、/**等情況

 

  代碼

package cn.huanzi.qch.util;

import java.util.Arrays;

/**
 * 一個簡單的URL訪問權限校驗工具類
 */
public class UrlSecurityUtil {

    /**
     * 檢查requestUri是否包含在urls中
     */
    public static boolean checkUrl(String requestUri,String[] urls){
        //對/進行特殊處理
        if("/".equals(requestUri) && !Arrays.asList(urls).contains(requestUri)){
            return false;
        }

        String[] requestUris = requestUri.split("/");
        for (int i = 0; i < urls.length; i++) {
            if(check(requestUris,urls[i].split("/"))){
                return true;
            }
        }

        return false;
    }
    private static boolean check(String[] requestUris,String[] urls){
        for (int i1 = 0; i1 < requestUris.length; i1++) {
            //判斷長度
            if (i1 >= urls.length){
                return false;
            }

            //處理/*、/**情況
            if("**".equals(urls[i1])){
                return true;
            }
            if("*".equals(urls[i1])){
                continue;
            }

            //處理帶后綴
            if(requestUris[i1].contains(".") && urls[i1].contains(".")){
                String[] split = requestUris[i1].split("\\.");
                String[] split2 = urls[i1].split("\\.");

                // *.后綴的情況
                if("*".equals(split2[0]) && split[1].equals(split2[1])){
                    return true;
                }
            }

            //不相等
            if(!requestUris[i1].equals(urls[i1])){
                return false;
            }

        }

        return true;
    }
}

 

  測試、效果

    public static void main(String[] args) {
        //無需權限即可訪問的URL
        String[] urls = {"/a/js/*.js","/a/img/**"};

        //給用戶配置的URL訪問權限
        HashMap<Object, Object> user = new HashMap<>();
        user.put("username","張三");
        user.put("urls",new String[]{"/","/a/css/*/common.css","/b/b1","/c/*","/d/**"});

        //滿足其中一種情況,就允許訪問
        String[] urlz = {
                "/",
                "/a/css/a/common.css",
                "/a/css/a/a1/common.css",
                "/a/js/layui.js",
                "/a/js/layui.css",
                "/a/img/a/a.jpg",
                "/a/img/a1.png",
                "/b/b1",
                "/b/b2",
                "/c/c1",
                "/c/c1/c2",
                "/d/d1/d2",
        };
        for (String url : urlz) {
            boolean flag = UrlSecurityUtil.checkUrl(url,urls) ||
                    UrlSecurityUtil.checkUrl(url,(String[])user.get("urls"));
            System.out.println(url+","+(flag ? "允許訪問!" : "無權訪問..."));
        }
    }

 

 

 

  后記

  有了基礎的URL權限控制后,可以配置成一個權限key對應多個URL,然后把權限key配給用戶:

{
    "ROLE_SA":{
        "/a/a1",
        "/b/*",
    },
    "ROLE_USER":{
        "/c/c1",
        "/d/*",
    }
}

  有了權限key基礎后,可以配置成一個角色對應多個權限key,然后把角色配給用戶:

{
    "部門經理":{
        "ROLE_SA",
        "ROLE_USER",
    },
    "普通員工":{
        "ROLE_USER",
    }
}

  萬丈高樓平地起,在這些基礎,可以進階一套我們自己的安全框架!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM