百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

一个简单的URL访问权限校验

zhezhongyun 2025-03-11 23:47 55 浏览

  前言

  安全框架,我们一般都会直接使用目前最流行的两大安全框架: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 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

出处:
https://www.cnblogs.com/huanzi-qch

若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.

相关推荐

Go语言标准库中5个被低估的强大package

在Go语言的世界里,开发者们往往对fmt、net/http这些“明星包”耳熟能详,却忽略了标准库里藏着的一批“宝藏工具”。它们功能强大却低调内敛,能解决并发控制、内存优化、日志管理等核心问题。今天就带...

作为测试人,如何优雅地查看Log日志?

作为一名测试工程师,测试工作中和Linux打交道的地方有很多。比如查看日志、定位Bug、修改文件、部署环境等。项目部署在Linux上,如果某个功能发生错误,就需要我们去排查出错的原因,所以熟练地掌握查...

Java 从底层与接口实现了解String、StringBuffer、StringBuilder

String、StringBuffer和StringBuilder的接口实现关系:String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。用于存放字符...

FluentData 从入门到精通:C#.NET 数据访问最佳实践

简介FluentData是一个微型ORM(micro-ORM),主打「FluentAPI」风格,让开发者在保持对原生SQL完全控制的同时,享受链式调用的便捷性。它与Dapper、Massi...

团队协作-代码格式化工具clang-format

环境:clang-format:10.0.0前言统一的代码规范对于整个团队来说十分重要,通过git/svn在提交前进行统一的ClangFormat格式化,可以有效避免由于人工操作带来的代码格式问题。C...

C# 数据操作系列 - 15 SqlSugar 增删改查详解(超长篇)

0.前言继上一篇,以及上上篇,我们对SqlSugar有了一个大概的认识,但是这并不完美,因为那些都是理论知识,无法描述我们工程开发中实际情况。而这一篇,将带领小伙伴们一起试着写一个能在工程中使用的模...

Mac OS 下 Unix 使用最多的100条命令(收藏级)

MacOS内置基于Unix的强大终端(Terminal),对开发者、运维工程师和日常用户来说,掌握常用的Unix命令是提升效率的关键。本文整理了100条在MacOS下最常用的U...

C语言字符串操作总结大全(超详细)

C语言字符串操作总结大全(超详细)1)字符串操作strcpy(p,p1)复制字符串strncpy(p,p1,n)复制指定长度字符串strcat(p,p1)附加字符串strncat...

经常使用到开源的MySQL,今天我们就来系统地认识一下

作为程序员,我们在项目中会使用到许多种类的数据库,根据业务类型、并发量和数据要求等选择不同类型的数据库,比如MySQL、Oracle、SQLServer、SQLite、MongoDB和Redis等。今...

电脑蓝屏代码大全_电脑蓝屏代码大全及解决方案

0X0000000操作完成0X0000001不正确的函数0X0000002系统找不到指定的文件0X0000003系统找不到指定的路径0X0000004系统无法打开文件0X0000005拒绝...

8个增强PHP程序安全的函数_php性能优化及安全策略

安全是编程非常重要的一个方面。在任何一种编程语言中,都提供了许多的函数或者模块来确保程序的安全性。在现代网站应用中,经常要获取来自世界各地用户的输入,但是,我们都知道“永远不能相信那些用户输入的数据”...

css优化都有哪些优化方案_css性能优化技巧

CSS优化其实可以分成几个层面:性能优化、可维护性优化、兼容性优化以及用户体验优化。这里我帮你梳理一份比较系统的CSS优化方案清单,方便你参考:一、加载性能优化减少CSS文件体积压缩CSS...

筹划20年,他终于拍成了这部电影_筹划20年,他终于拍成了这部电影英语

如果提名好莱坞最难搞影星,你第一时间会联想到谁?是坏脾气的西恩·潘,还是曾因吸毒锒铛入狱的小罗伯特·唐尼,亦或是沉迷酒精影响工作的罗素·克劳?上述大咖,往往都有着这样或那样的瑕疵。可即便如此,却都仍旧...

Keycloak Servlet Filter Adapter使用

KeycloakClientAdapters简介Keycloakclientadaptersarelibrariesthatmakeitveryeasytosecurea...

一些常用的linux常用的命令_linux常用命令有哪些?

在Linux的世界里,命令是与系统交互的基础。掌握常用命令不仅能让你高效地管理文件、进程和网络,还能为你进一步学习系统管理和自动化打下坚实的基础。本文将深入探讨一些最常用且功能强大的Linux...