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

  前言

  安全框架,我们一般都会直接使用目前最流行的两大安全框架: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 ? "允许访问!" : "无权访问..."));
        }
    }

  后记

  有了基础的URL权限控制后,可以配置成一个权限key对应多个URL,然后把权限key配给用户:

{
    "ROLE_SA":{
        "/a/a1",
        "/b/*",
    },
    "ROLE_USER":{
        "/c/c1",
        "/d/*",
    }
}

  有了权限key基础后,可以配置成一个角色对应多个权限key,然后把角色配给用户:

{
    "部门经理":{
        "ROLE_SA",
        "ROLE_USER",
    },
    "普通员工":{
        "ROLE_USER",
    }
}

  万丈高楼平地起,在这些基础,可以进阶一套我们自己的安全框架!

版权声明

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

AD广告位(长期招租,如有需要请私信)

【基塔后台】免费后台管理系统,低代码快速搭建管理后台

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元!
【腾讯云】境外1核2G服务器低至2折,半价续费券限量免费领取!
【腾讯云】星星海SA2云服务器,1核2G首年99元起,高性价比首选!
【腾讯云】中小企业福利专场,多款刚需产品,满足企业通用场景需求,云服务器2.5折起!

【阿里云】新老用户同享,上云优化聚集地!
【阿里云】最新活动页,上新必买抢先知,劲爆优惠不错过!
【阿里云】轻量应用服务器2核2G 低至60元/年起!香港与海外服务器最低24元/月起!
【阿里云】ECS实例升级、续费,享低至 6.3折 限时折扣!

捐献、打赏

请注意:作者五行缺钱,如果喜欢这篇文章,请随意打赏!

支付宝

微信


QQ群交流群

QQ群交流群
有事请加群,有问题进群大家一起交流!

原文地址:https://www.cnblogs.com/huanzi-qch/p/15252779.html