前言
目前最流行的兩大安全框架:SpringSecruity、Shiro
許可權控制,無非就是:前端控制元件是否可見、是否允許請求/訪問URL
本文分享一個簡單的URL訪問許可權校驗,支援/、/*、/**等情況
程式碼
package cn.huanzi.qch.baseadmin.util;/**
* 一個簡單的URL訪問許可權校驗工具類
*/
public class UrlSecurityUtil { /**
* 檢查requestUri是否包含在urls中
*/
public static boolean checkUrl(String requestUri,String[] urls){
//對/進行特殊處理
if("/".equals(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[]{"/b/b1","/c/*","/d/**"}); //滿足其中一種情況,就允許訪問
String[] urlz = {
"/",
"/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",
}
}
萬丈高樓平地起,有了這些基礎,一套許可權管理系統也就不遠了