前言
安全架構,我們一般都會直接使用目前最流行的兩大安全架構: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 ? "允許通路!" : "無權通路..."));
}
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2EjM3QDN2kTOx0iM0YjMzADM5AzMxkDMxIDMy0SN1AzM1MTMvwVOwEjMwIzLcVTNwMTNzEzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
後記
有了基礎的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折 限時折扣!
捐獻、打賞
請注意:作者五行缺錢,如果喜歡這篇文章,請随意打賞!
支付寶
微信
QQ群交流群
有事請加群,有問題進群大家一起交流!