【异常】SpringSecurity登录失败:Full authentication is required to access this resource

news2024/11/21 0:34:28

一、报错提示

在这里插入图片描述
在这里插入图片描述

SpringSecurity提示如下内容:

2023-01-07 06:08:51.843 [cdi-ids-commonprovider] [http-nio-9092-exec-14] 
WARN  com.desaysv.tsp.logic.ids.config.MyAuthenticationEntryPoint - 
登录失败:Full authentication is required to access this resource

二、排查问题

2.1 前端排查

先看前端配置,没有什么问题的感觉?
在这里插入图片描述
前端,匹配所有的api 前缀并进行替换为 ’ ’

然后将请求转发到后端localhost端口号为9092的服务

2.2 接口层面排查

请求网址为以下截图,
在这里插入图片描述
请求的网址为/api/get-validate-code

没错,我就是要调用的是这个/get-validate-code

2.3后端服务排查

2.2.1检查验证码的拦截器

OncePerRequestFilter是Spring Boot里面的一个过滤器抽象类,
OncePerRequestFilter在Spring Security里面被广泛用到,
OncePerRequestFilter过滤器抽象类通常被用于继承实现并在每次请求时只执行一次过滤。

@Component
public class ValidateCodeFilter extends OncePerRequestFilter {
    // spring的正则匹配
    private static final PathMatcher pathMatcher = new AntPathMatcher();
    @Autowired
    private MyAuthenticationFailureHandler authenticationFailureHandler;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        // 只有登录请求‘/login’,并且为'post'请求时,才校验
        if ("POST".equals(request.getMethod())
                && pathMatcher.match("/login", request.getServletPath())) {
            try {
                codeValidate(request);
            } catch (ValidateCodeException e) {
                // 验证码不通过,跳到错误处理器处理
                authenticationFailureHandler.onAuthenticationFailure(request, response, e);
                // 异常后,不执行后面
                return;
            }
        }
        doFilter(request, response, filterChain);
    }

2.2.1进行接口断点

其中,接口在访问此处时候,可以看拦截请求,我们看拦截的接口的URL,诶?
怎么会有/api的前缀的呢?这个不是我想的呀
在这里插入图片描述

2.2.2 看看获取验证码的逻辑

此处是我获取拦截器的逻辑,看起来也没有什么毛病啊?

@Controller
public class ValidateCodeController {
    @Autowired
    private ValidateCodeCreateService validateCodeCreateService;

    @GetMapping("/get-validate-code")
    public void getImageCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建验证码
        ValidateCode validateCode = validateCodeCreateService.createImageCode();
        response.setContentType(MediaType.IMAGE_JPEG_VALUE);
        // 将验证码放到session中(推荐放在Redis中,可设置过期时间能自动删除)
        request.getSession().setAttribute("validate-code", validateCode);
        // 返回验证码给前端
        ImageIO.write(validateCode.getImage(), "JPEG", response.getOutputStream());
    }
}

2.2.3 检查SpringSecurity配置文件

既然是SpringSecurity配置文件,那肯定要看SpringSecurityConfig文件

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        // Spring Boot不允许加载iframe问题解决
        http.headers().frameOptions().disable();
        http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) // 后台验证码
                // .addFilterAfter(myLogoutFilter,UsernamePasswordAuthenticationFilter.class)
                .csrf().disable().authorizeRequests()
                .antMatchers(
                        "/static/**",
                        "/session/invalid",
                        "/clb-health",
                        "/getAllModel/**",
                        "/getVoiceServiceModel/**",
                        "/login/**",
                        "/logout/**",
                        "/modifyPassword/**",
                        "/instances",
                        "/actuator/**",
                        "/get-validate-code",
                        "/etm/**",
                        "/loginOrLogout/**")
                .permitAll().anyRequest().authenticated()
                .and().logout().logoutSuccessHandler(logoutSuccessHandler).deleteCookies("JSESSIONID")
                .and().formLogin().permitAll()
                .successHandler(authenticationSuccessHandler)
                .failureHandler(authenticationFailureHandler)
                .and().exceptionHandling().authenticationEntryPoint(myAuthenticationEntryPoint);
    }

SpringSecurityConfig文件显示,放行所有的 “/get-validate-code”,但是没有说要放行/api/get-validate-code

于是锁定问题肯定是前端的问题了。为啥要把/api传过来呢?

2.4 再次前端排查

(1)尝试修改target的URL

即由原来的
target: 'http://localhost:9092/api/',
修改为
target: 'http://localhost:9092/',
在这里插入图片描述
记得重启前端服务哦,不会热启动的。

(2)验证

发现正常获取到验证码了。并且能正常进行登录了
在这里插入图片描述
在这里插入图片描述

2.5 那为什么要进行API的改写呢?

是不是失效了呢?这个问题有待深入了解,先这样!问题解决了就好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+Jsp+SpringMVC漫威手办商城系统设计和实现

基于JavaJspSpringMVC漫威手办商城系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…

2023 年值得关注的 7 大人工智能 (AI) 技术趋势

💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 人工智能 (AI) 已经接…

图数据库Neo4j实战(全网最详细教程)

1.图数据库Neo4j介绍 1.1 什么是图数据库(graph database) 随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随数…

《Go 并发数据结构和算法实践》学习笔记 Day 1

极客时间21天打卡活动:2023.1.16-2.5 链表的接口: 插入元素删除元素读取元素 并发化改造: 并发插入元素并发删除元素并发读取元素 锁,每个节点都定义一把锁。 并发插入 区域猜想:如果某个CPU 锁定了某个节点&…

U3D客户端框架(资源管理篇)之资源热更新管理器 ResourceManager

一、资源热更新管理器模块设计 1.热更新是什么? 游戏或者软件内的 美术/脚本代码等资源 发生变化时,无需下载客户端重新进行安装,而是在应用程序启动的情况下,通过比对本地资源与CDN资源的MD5码,如果本地资源与CDN中…

Visual Code 打开方式添加到右键菜单

一、配置右键打开 文件 注册表找到分支: 计算机\HKEY_CLASSES_ROOT\*\shell 在这个里面 shell 分支里右键添加项 VisualCode(这个可以随便起,便于识别就行) 在 VisualCode 分支里右键添加项 Command(必须这个名&am…

【C++】双指针用法

快慢指针/同向指针 [0,i)的数据代表处理好的数据[i,j)的数据是那些处理过但不需要的数据[j,array.length)区间的数据为接下来待处理的数据。 以上三个区间的开和闭需要根据题目要求定义,但是要保持一致。 用此方法处理过的数组,处理好的数据相对位置会保…

(mysql)Waiting for table metadata lock

MySQL5.5 中引入了 metadata lock. 顾名思义,metadata lock 不是为了保护表中的数据的,而是保护 database objects(元数据)的。包括表结构、schema、存储过程、函数、触发器、mysql的调度事件(events). 要理解 metadata lock 最重要的一点就是&#xff1…

python连接mysql之PyMySQL的基本使用

一、PyMySQL的基本使用使用pymysql 直接连接mysqlPyMySQL安装pip3 install pymysqlimport pymysql# 连接数据库,创建连接对象connection # 连接对象作用是:连接数据库、发送数据库信息、处理回滚操作(查询中断时,数据库回到最初状…

关于Docker如何安装nginx

目录 1.Nginx 1.2. 安装nginx 2.容器之间相互通信 2.1.两个容器在同一网段 2.2.两个容器在不同网段 1.Nginx Nginx也是一款服务器,我们常用它做如:反向代理、负载均衡、动态与静态资源的分离的工作 反向代理:反向代理(Revers…

java spring下载步骤

首先 我们要下载一下 spring 我们访问spring的官网 地址非常的好记 spring.io project进入官网我们选择 project>Spring Framework 进入界面 我们选择 Learn 下面就会给我们列举出版本 这边建议大家下5.3.24 首先 要下GA的 因为这表示它比较稳定 其次 版本比较适中 大部分…

黑客动态播报 | 2023年网络攻击趋势

今天是跨入2023年大门的第一个工作日,作为开年的第一篇内容,我们从安全说起。      自2020年勒索软件攻击呈爆发式增长以来,全球企业都经历了“噩梦”般的三年,层出不穷的手段和无孔不入的方式,都让我们绷紧了每一条神经。      而在这三年里,我们并不是疲于应对,通过不…

过年了,怎么样批量爬取某东商品信息,并做可视化

前言 马上就要过年了,大家都在屯年货了网络上商品信息太多,不知道如何选择,今天,我们就用python爬取商品信息,并做可视化。 环境使用 python 3.9pycharm 模块使用 requestsseleniumtime谷歌驱动 说明 一、谷歌驱动…

前端学习之BootStrap

前言 Bootstrap 最初是由 mdo 和 fat 于 2010 年中旬创造就职于 Twitter 时创造的。在成为开源框架之前,Bootstrap 被称为 Twitter Blueprint。经过几个月的开发,Twitter 举办了首届黑客周(Hack Week),该项目获得了爆…

基于Java+SpringBoot+vue+elementUI私人健身教练预约管理系统设计实现

基于JavaSpringBootvueelementUI私人健身教练预约管理系统设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留…

Linux中的文件描述符

目录 文件描述符 系统调用 open 为什么fd从3开始呢? 为什么是0,1,2,3...呢? 文件描述符分配规则 系统调用 close 系统调用 wirte 系统调用 read 文件描述符 在了解文件描述符之前,先了解关于操作文件的系统调用,C语言中的f…

Spring Cloud整体架构

Spring Cloud的中文名我们就暂且称呼它为“春云”吧,听上去是多么朴实无华的名字,不过呢一般名字起的低调的都是厉害角色,我们就看看Spring Cloud都提供了哪些靠谱功能吧。 技多不压身 我们前面说过,Spring Cloud是一款微服务架…

Aspect-based Sentiment Analysis with Opinion Tree Generation 论文阅读笔记

一、作者 Xiaoyi Bao、Wang Zhongqing、 Xiaotong Jiang、 Rong Xiao、Shoushan Li Natural Language Processing Lab, Soochow University, Suzhou, China Alibaba Group, Hangzhou, China 二、背景 作为细粒度的情感分析任务,ABSA 涉及了多个基本情感元素&am…

(八)汇编语言——数据处理的两个基本问题

目录 用于内存寻址的寄存器 bp 组合 两个基本问题 数据位置 立即数 寄存器 内存 数据长度 除法指令 dup指令 总结 接下来,我们要处理的是有关数据处理的两个基本问题,那么这两个基本问题是什么呢?我们先告诉大家这两个问题&#…

《操作系统-真象还原》15. 系统交互

文章目录fork 的原理与实现简介什么是 forkfork 的实现思路代码get_a_page_without_opvaddrbitmapcopy_pcb_vaddrbitmap_stack0copy_body_stack3build_child_stackupdate_inode_open_cntscopy_processsys_fork添加 fork 系统调用与实现 init 进程添加 fork 系统调用实现 init 进…