天天看點

一個簡單的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通路權限校驗

  後記

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

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

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

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

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

版權聲明

作者:huanzi-qch

出處:https://www.cnblogs.com/huanzi-qch

若标題中有“轉載”字樣,則本文版權歸原作者所有。若無轉載字樣,本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連結,否則保留追究法律責任的權利.

AD廣告位(長期招租,如有需要請私信)

【基塔背景】免費背景管理系統,低代碼快速搭建管理背景

【騰訊雲】雲産品限時秒殺,爆款1核2G雲伺服器,首年74元!

【騰訊雲】境外1核2G伺服器低至2折,半價續費券限量免費領取!

【騰訊雲】星星海SA2雲伺服器,1核2G首年99元起,高成本效益首選!

【騰訊雲】中小企業福利專場,多款剛需産品,滿足企業通用場景需求,雲伺服器2.5折起!

【阿裡雲】新老使用者同享,上雲優化聚集地!

【阿裡雲】最新活動頁,上新必買搶先知,勁爆優惠不錯過!

【阿裡雲】輕量應用伺服器2核2G 低至60元/年起!香港與海外伺服器最低24元/月起!

【阿裡雲】ECS執行個體更新、續費,享低至 6.3折 限時折扣!

捐獻、打賞

請注意:作者五行缺錢,如果喜歡這篇文章,請随意打賞!

一個簡單的URL通路權限校驗

支付寶

一個簡單的URL通路權限校驗

微信

QQ群交流群

有事請加群,有問題進群大家一起交流!

一個簡單的URL通路權限校驗