前言
安全框架,我們一般都會直接使用目前最流行的兩大安全框架: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", } }
萬丈高樓平地起,在這些基礎,可以進階一套我們自己的安全框架!
