一个简单的URL访问权限校验
前言
目前最流行的两大安全框架: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",
}
}
万丈高楼平地起,有了这些基础,一套权限管理系统也就不远了
一个简单的URL访问权限校验的更多相关文章
- 用Lua控制Nginx静态文件的url访问权限
需求背景:比如我们有一个存储文件的web服务器,一般通过url可直接访问到:http://127.0.0.1/uploads/test.rar,如果我们需要限制别人的访问,可以通过添加lua脚本来控制 ...
- Android 在 SElinux下 如何获得对一个内核节点的访问权限【转】
本文转载自:https://blog.csdn.net/wh_19910525/article/details/45170755 Android 5.0下,因为采取了SEAndroid/SElinux ...
- 利用JS跨域做一个简单的页面访问统计系统
其实在大部分互联网web产品中,我们通常会用百度统计或者谷歌统计分析系统,通过在程序中引入特定的JS脚本,然后便可以在这些统计系统中看到自己网站页面具体的访问情况.但是有些时候,由于一些特殊情况,我们 ...
- Android 在 SElinux下 如何获得对一个内核节点的访问权限
点击打开链接 Android 5.0下,因为采取了SEAndroid/SElinux的安全机制,即使拥有root权限,或者对某内核节点设置为777的权限,仍然无法在JNI层访问. 本文将以用户自定义的 ...
- Android 5.0 SEAndroid下如何获得对一个内核节点的访问权限
-9]* u:object_r:tty_device:s0 # We add here /dev/wf_bt u:object_r:wf_bt_device:s0 wf_bt ...
- 使用 Suricata 进行入侵监控(一个简单小例子访问百度)
前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 1.自己编写一条规则,规则书写参考snort规则(suricata ...
- 一个简单的以User权限启动外部应用程序(用NetUserAdd函数和USER_INFO_1结构体动态添加用户,然后用CreateProcessWithLogonW启动程序)
版权声明:本文为博主原创文章,未经博主允许不得转载. BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lp ...
- 一个简单的以User权限启动外部应用程序
BOOL ExecuteAsUser(LPCWSTR lpszUserName, LPCWSTR lpszPassword, LPCWSTR lpszApplication, LPCWSTR lpsz ...
- spring security实现简单的url权限拦截
在一个系统中,权限的拦截是很常见的事情,通常情况下我们都是基于url进行拦截.那么在spring security中应该怎么配置呢. 大致步骤如下: 1.用户登录成功后我们需要拿到用户所拥有的权限,并 ...
随机推荐
- 【GCC编译器】Swing Modulo Scheduling
1. SMS 在 GCC 中的实现 1.1. 一些基本概念 (1)软流水(Software pipelining )是一种通过重叠不同迭代的指令,使其并行执行,从而改进循环中指令调度的技术.关键思想是 ...
- python3中的希尔排序
def shell_sort(alist): n = len(alist) # 初始步长 gap = round(n / 2) while gap > 0: # 按步长进行插入排序 for i ...
- Arp欺骗和DNS投毒
中间人攻击 ARP缓存攻击 ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址.简单来说,就 ...
- 【LeetCode】424. 替换后的最长重复字符
424. 替换后的最长重复字符 知识点:字符串,滑动窗口: 题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含 ...
- 特殊回文数 BASIC-9
特殊回文数 代码 import java.util.Scanner; /*123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数, 满足 ...
- 保存Total Commander的列宽
Total Commander的默认列宽经常显示不全内容,需要手工调整,用"Menu -> Configuration -> Save Position"可以永久保存列 ...
- Groovy+Spock单元测试
一.导入依赖 Spock是基于JUnit的单测框架,提供一些更好的语法,结合Groovy语言,可以写出更为简洁的单测. <!-- groovy依赖 --> <dependency&g ...
- 使用JS获取SessionStorage的值
参考:https://www.jb51.net/article/132729.htm 获取sessionStorage的意义 首先获取它是为了将获得的信息输出或者alert():让人容易看到, 其次, ...
- SQLServer 判断文件是否存在
根据20190621工作写的逻辑,以后可根据实际情况再做修改.顺便记录一下游标的使用,加强记忆. DECLARE @Id NVARCHAR(MAX) DECLARE @UserName NVARCHA ...
- CrackMe-Cycle
转载自 OllyDBG入门教程 PS:自己逆在 最后的时候总会崩,不知道为什么. 我们输入用户名 CCDebuger,序列号 78787878,点上面那个"Check"按钮,呵 ...