基于注解方式实现Spring Security忽略拦截

2023-10-28

1.Spring Security忽略拦截配置

关于Spring Securite的使用可以参考我写的这篇博客: 【SpringBoot框架篇】16.security整合jwt实现对前后端分离的项目进行权限认证

像这种需要忽略某个接口需要在Spring Security配置类中在代码中写死,非常的不灵活。
在这里插入图片描述

2.基于配置文件注入

2.1.添加配置

一般像一些静态资源文件需要过滤掉安全认证,例如图片,.css,.js等静态资源文件,像这种在配置文件中指定比较方便。
application.yml配置

#不需要认证的接口地址
security:
  ignore:
   get:
     - /image/**
   post:

   all:

添加配置类注入配置的参数

@Configuration
@ConfigurationProperties(prefix = "security.ignore")
public class IgnoreSecurityPropetties {

    /**
     * 需要忽略的接口路径 不限制请求类型
     */
    private List<String> all;

    /**
     * 需要忽略的Get请求类型接口路径
     */
    private List<String> get;

    /**
     * 需要忽略的Post请求类型接口路径
     */
    private List<String> post;
    //省略 get,set方法

2.2.修改Spring Security配置类

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 	@Resource
    private IgnoreSecurityPropetties ignoreSecurityPropetties;
    
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {

        String[] all = new String[ignoreSecurityPropetties.getAll().size()];
        String[] get = new String[ignoreSecurityPropetties.getGet().size()];
        String[] post = new String[ignoreSecurityPropetties.getPost().size()];
        ignoreSecurityPropetties.getGet().toArray(get);
        ignoreSecurityPropetties.getPost().toArray(post);
        ignoreSecurityPropetties.getAll().toArray(all);

        if (all.length > 0) {
            authorizeRequest.antMatchers(all).permitAll();
        }
        if (get.length > 0) {
            authorizeRequest.antMatchers(HttpMethod.GET, get).permitAll();
        }
        if (post.length > 0) {
            authorizeRequest.antMatchers(HttpMethod.POST, post).permitAll();
        }
        // 其它接口都要认证
        authorizeRequest.anyRequest().authenticated();

    }
}    

2.3. 测试

@RestController
@RequestMapping("/test")
public class TestIgnoreController {

    @GetMapping("/image/{id}")
    public String image(@PathVariable String id) {
        return id;
    }
}   

在这里插入图片描述

如果从配置文件中删除了过滤的接口名称则访问接口会返回403
在这里插入图片描述

3.基于注解的方式过滤接口

3.1.添加忽略拦截注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IgnoreWebSecurity {

    /**
     * 忽略接口的名称,默认使用Controller访问路径+接口的的访问路径
     * 使用场景匹配url传参的动态参数匹配 例如: /user/{id},像这种需要配置注解值为 /user/*
     */
    String value() default "";

}

3.2.获取所有使用了@IgnoreWebSecurity注解的接口访问路径

  • 用到了2.2中的IgnoreSecurityPropetties类存放忽略的接口名称
  • 用到了2.3中的修改security配置类
@Configuration
public class InitIgnoreWebSecurityConfig implements ApplicationContextAware {

    @Autowired
    private IgnoreSecurityPropetties ignoreSecurityPropetties;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

        Map<String, Object> beanMap = applicationContext.getBeansWithAnnotation(RestController.class);
        beanMap.forEach((k, v) -> {

            //Controllers配置的访问路径
            String baseUrl = "";
            Class<?> controllerClass = v.getClass();
            RequestMapping annotation = AnnotatedElementUtils.findMergedAnnotation(controllerClass, RequestMapping.class);

            //如果RequestMapping注解存在,使用RequestMapping里配置的路径名称
            if (annotation != null) {
                baseUrl = annotation.value().length > 0 ? annotation.value()[0] : "";
            }

            //判断访问路径前缀是否包含/
            if (!baseUrl.startsWith("/")) {
                baseUrl = "/" + baseUrl;
            }

            //获取所有声明的方法
            Method[] allMethods = controllerClass.getMethods();
            IgnoreWebSecurity ignoreWebSecurity;
            PostMapping postMapping;
            GetMapping getMapping;
            String methodType;

            for (Method method : allMethods) {
                methodType = "";
                //判断方法是否使用忽略权限认证注解
                ignoreWebSecurity = AnnotatedElementUtils.findMergedAnnotation(method, IgnoreWebSecurity.class);
                if (ignoreWebSecurity != null) {
                    String url = "";
                    //当注解没配置接口名称时候使用接口名称(Controller访问路径+接口访问路径)
                    //目前只适配了PostMapping和GetMapping注解,其它类型请自行扩展
                    postMapping = AnnotatedElementUtils.findMergedAnnotation(method, PostMapping.class);
                    if (postMapping != null) {
                        url = postMapping.value().length > 0 ? postMapping.value()[0] : "";
                        methodType = "post";
                    } else {
                        getMapping = AnnotatedElementUtils.findMergedAnnotation(method, GetMapping.class);
                        if (getMapping != null) {
                            url = getMapping.value().length > 0 ? getMapping.value()[0] : "";
                            methodType = "get";
                        }
                    }
                    //注解如果配置了接口路径则使用注解内的
                    if (StringUtils.hasText(ignoreWebSecurity.value())) {
                        url = ignoreWebSecurity.value();
                    }
                    if (url.trim().length() > 0) {
                        url = (baseUrl + "/" + url).replaceAll("/+", "/");
                    } else {
                        url = baseUrl;
                    }
                    if ("post".equals(methodType)) {
                        ignoreSecurityPropetties.getPost().add(url);
                    } else if ("get".equals(methodType)) {
                        ignoreSecurityPropetties.getGet().add(url);
                    }
                }
            }
        });
        System.out.println("需要忽略的get请求类型接口路径如下" );
        for(String get: ignoreSecurityPropetties.getGet()){
            System.out.println(get);
        }
        System.out.println("需要忽略的post请求类型接口路径如下");
        for(String post: ignoreSecurityPropetties.getPost()){
            System.out.println(post);
        }
    }
    
}

启动后会输出
在这里插入图片描述

忽略的接口访问路径规则以下文3.3的测试接口为例,
String baseUrl=@RestController控制器的访问路径(/test)
优先级1: String url=baseUrl+IgnoreWebSecurity(注解内值) =/test/css/*
优先级2: String url=baseUrl+接口访问路径(/login) =/test/login

3.3.测试

在需要忽略认证的接口上面添加@IgnoreWebSecurity注解

@RestController
@RequestMapping("/test")
public class TestIgnoreController {

    @IgnoreWebSecurity("/css/*")
    @GetMapping("/css/{id}")
    public String css(@PathVariable String id) {
        return id;
    }

    @IgnoreWebSecurity
    @GetMapping("/login")
    public String login() {
        return "登录成功";
    }
}

测试用注解修饰的接口路径,可以正常访问,由此可看配置是正常。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于注解方式实现Spring Security忽略拦截 的相关文章

随机推荐

  • LongAdder类和AtomicInteger类

    voliate关键在保证可见性但是不保证原子性 多线程下还是有线程安全问题 不使用voliate情况下 使用voliate情况下 换成使用线程安全的类 也可以使用LongAdder类来实现线程安全 LongAdder类 在 LongAdde
  • springboot+vue上传至云服务后出现的跨域问题

    一 情况简介 在学习spring boot vue3前后端分离项目时 前期一直是用的自己电脑进行的开发及运行测试 当时就出现了跨域的问题 经过上网查询后在VUE中进行代理跨域的设置即可 但当我把前后端项目打包放到云服务上后却又出现了跨域的问
  • git命令之新建仓库

    一 配置git用户名 1 安装git 配置用户名和邮箱 git config global user name 你的用户名 git config global user email 你的注册邮箱 2 使用git config global
  • LangChain(6)构建用户自己的Agent

    构建用户自己的Agent 编写简单的计算工具 编写有多个参数的工具 其它更高级的工具 LangChain 中有一些可用的Agent内置工具 但在实际应用中我们可能需要编写自己的Agent 编写简单的计算工具 pip install qU l
  • OllyDBG 入门

    一 OllyDBG 的安装与配置 OllyDBG 1 10 版的发布版本是个 ZIP 压缩包 只要解压到一个目录下 运行 OllyDBG exe 就可以了 汉化版的发布版本是个 RAR 压缩包 同样只需解压到一个目录下运行 OllyDBG
  • Java入门扫盲

    j2ee那是原来的叫法 现在叫javaEE 以前的规范分为三种 j2se j2me j2ee 分别是基础平台 小型移动设备程序和企业级应用 现在javaEE开发称为web开发也行吧 javaEE框架太多了 例如 spring hiberna
  • IOS MDM流程

    http www mbaike net ios 1552 html 一 MDM资料下载 BH US 11 Schuetz InsideAppleMDM WP pdf MDM流程及资料最全的PDF文档 二 MDM流程整理 1 创建和部署htt
  • Win10激活(家庭版升级到专业版)带你5分钟解决

    作为一名计算机专业的学生 将自己的电脑激活到专业版是我们的必经之路 接下来的内容希望对在座的各位同学有帮助 一 误删密钥导致windows处于未激活状态的解决方法 点击 激活 疑难解答 升级到专业版后 需要产品密钥才能激活 二 最快速有效的
  • ios英语口语800句应用源码

    前几天突发奇想做了个很水的应用 名字叫chinese 800 汉语口语800句 现在让别人传上去了 正在传 今天又改了一下变成了英语口语800句 加了广告条 ui 没有优化 我随便整的两个图片 有人会ps的可以再优化一下ui 应用含800个
  • 盘点免费好用的5款思维导图工具

    在日常生活 学习和工作之中 我们难免会面对纷乱繁杂的知识或信息 运用思维导图对信息和内容进行整理 可以直接有效且高效地将散点链接成为相关联的 有逻辑的整体 当我们善用思维导图对这些内容进行分类梳理 自然而然我们的效率就会得到很大程度的提升
  • 玩转软路由 篇四:软路由中OpenWRT作为旁路由的安装设置教程

    开篇说一些仁者见仁智者见智的话 先声明 这只是代表我自己近期浅陋的看法 看到很多人玩路由器 刷各种固件 什么爱快 高格 老毛子 OpenWRT什么的 自己也折腾过 也在恩山论坛里下载各路大神的固件使用 作为一个小白 就自然而然想到 这么多固
  • 3.2 二维随机变量的边缘分布

    思维导图 学习目标 要学习二维随机变量的边缘分布 我可能会按照以下步骤进行学习 理解二维随机变量的概念和表示方法 包括联合分布函数和联合分布律等概念 理解二维随机变量的边缘分布的概念和意义 即在已知联合分布的情况下 如何求出单独一个随机变量
  • 前端Javascript,ES6常见面试题

    一 Javascript js数据类型 及检测 共8种常用的6种类型 基本类型 Number String Boolean undefined Null 引用类型 object function 不常用2种类型 Symbol bigInt
  • 浏览器手势识别原理

    以下内容转自 链接 https www zhihu com question 20607813 answer 1396981185 来源 知乎 Stroke 是作者的一款开源鼠标手势 支持复杂手势 对于这个问题 我觉得可以细分为这样两个子问
  • C/C++cmath库常用函数

    在一些计算题目中 我们常会用到求和 取绝对值以及求三角函数等代码 写出来需要耗费一番功夫 于是 C C 库中提供了一个包含各种计算函数的头文件 cmath库 C C 中的cmath头文件 C include
  • S_ISREG S_ISDIR 等几个常见的宏

    转自 http blog csdn net dssxk article details 6793370 S ISLNK st mode 是否是一个连接 S ISREG st mode 是否是一个常规文件 S ISDIR st mode 是否
  • FFT将时域信号变换到频域里面的一些重要知识点记录

    一 FFT是离散傅立叶变换 采样得到的数字信号 就可以做FFT变换了 N个采样点 经过FFT之后 就可以得到N个点的FFT结果 为了方便进行FFT运算 通常N取2的整数次方 假设采样频率为Fs 信号频率F 采样点数为N 那么FFT之后结果就
  • Spring容器IOC初始化过程---今天终于进行总结了

    一 老规矩 先比比点幺蛾子 作为一个经常使用Spring的后端程序员 小编很早就想彻底弄懂整个Spring框架了 但它整体是非常大的 所有继承图非常复杂 加上小编修行尚浅 显得力不从心 不过 男儿在世当立志 今天就先从Spring IOC容
  • 国民技术MCU开发之频率修改

    文章目录 前言 设置外部输入晶振频率 修改MCU时钟主频 修改系统时钟源 配置HCLK PCLK2和PCLK1 前言 本文以N32L403芯片为例 依赖库文件版本为 N32L40xxx V2 0 0 记录了国民MCU关于频率修改的位置和方法
  • 基于注解方式实现Spring Security忽略拦截

    文章目录 1 Spring Security忽略拦截配置 2 基于配置文件注入 2 1 添加配置 2 2 修改Spring Security配置类 2 3 测试 3 基于注解的方式过滤接口 3 1 添加忽略拦截注解 3 2 获取所有使用了