前言
安全框架,我们一般都会直接使用目前最流行的两大安全框架: Spring Secruity、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",
}
}
万丈高楼平地起,在这些基础,可以进阶一套我们自己的安全框架!
版权声明
作者:huanzi-qch
出处:
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.