Springboot +spring security,实现前后端分离,使用JSON数据格式登录(将表单提交方式改成json格式登录)

news2025/1/13 2:49:48

一.简介

在前面的文章中,我们使用表单方式完成登录提交,但是目前基本都是前后端分离项目,很少使用表单提交的方式,基本都是json方式,使用ajax提交,那么我们怎么将表单提交方式改成json格式登录呢?

二.思路分析

通过前面源码部分学习中,已经知道在HttpSecurity配置中,每新增一种配置,都会加入一个过滤器,或者覆盖默认的过滤器,那么使用的表单登录也是同样使用过滤器,追踪源码看下他的过滤器:UsernamePasswordAuthenticationFilter

2.1原始表单过滤器提交认证请求的逻辑

在这里插入图片描述

  1. 使用Obtain获取用户名和密码,其实就是通过request.getParameter获取
  2. 然后将用户名和密码封装在token
  3. 调用proverManager.authenticate()进行认证 所以基于这块我们可以参考上节课验证码的思路:

2.2实现思路

  1. 写一个过滤器,继承UsernamePasswordAuthenticationFilter
  2. 从json格式参数中获取用户名和密码
  3. 然后进行封装成token
  4. 调用this.getAuthenticationManager().authenticate(authRequest) 完成认证
  5. 如果不是json格式请求则还是走原先的逻辑,调用父类attemptAuthentication(request, response);按照原先参数传递方式进行认证。

三.创建项目

如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。

四.代码实现

4.1定义Json 过滤器

  1. 定义json过滤器,
  2. 继承UsernamePasswordAuthenticationFilter,
  3. 从json格式参数中获取用户名和密码,
  4. 然后进行封装成token,
  5. 调用this.getAuthenticationManager().authenticate(authRequest) 完成认证,
    如果不是json格式请求则还是走原先的逻辑,调用父类attemptAuthentication(request, response);按照原先参数传递方式进行认证。

代码如下:

public class JsonLoginFilter extends UsernamePasswordAuthenticationFilter {
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        if (request.getContentType().equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)){
            try {
                Map<String,String> map = new ObjectMapper().readValue(request.getInputStream(), new TypeReference<>() {
                });
                String userName = map.get(getUsernameParameter());
                String passwd = map.get(getPasswordParameter());
                UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userName, passwd);
                return this.getAuthenticationManager().authenticate(authenticationToken);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        return super.attemptAuthentication(request, response);
    }
}

4.2配置Json过滤器

配制json过滤器的代码如下:

@Bean
    public JsonLoginFilter jsonLoginFilter(){
        JsonLoginFilter jsonLoginFilter = new JsonLoginFilter();
        jsonLoginFilter.setAuthenticationManager(authenticationManager());
        jsonLoginFilter.setAuthenticationFailureHandler(new AuthenticationFailureHandler() {
            @Override
            public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                Map<String,Object> result = new HashMap<>();
                result.put("code",-1);
                result.put("msg","登录失败");
                result.put("data",exception.getMessage());
                writeResp(result,response);
            }
        });
        jsonLoginFilter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandler() {
                    @Override
                    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                        Map<String,Object> result = new HashMap<>();
                        result.put("code",-1);
                        result.put("msg","登录成功");
                        result.put("data",authentication);
                        writeResp(result,response);
                    }
                });
        return jsonLoginFilter;
    }

4.3配置SecurigyFilterChain

配置SecurigyFilterChain的代码如下:

 @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests().anyRequest().authenticated()
                .and()
                .addFilterAt(jsonLoginFilter(), UsernamePasswordAuthenticationFilter.class)
                .csrf().disable();
        return http.build();
    }

4.4配置SecurityFilterchain

配置SecurityFilterchain的代码如下:

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((auth) ->{
            try {
                auth.antMatchers("/kaptcha").permitAll()
                        .anyRequest().authenticated()
                        .and().formLogin()
                        .loginPage("/login.html")
                        .loginProcessingUrl("/login")
                        .failureForwardUrl("/login.html")
                        .permitAll()
                        .and()
                        .csrf().disable();
            }
            catch (Exception e){
            }
        });
        return http.build();
    }

这样就实现了将表单提交方式改成json格式登录。

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

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

相关文章

语雀批量导出 mardown 文档(不需要 token)

推荐一个小工具&#xff1a;renyunkang/yuque-exporter &#xff0c;可以不借助语雀超级会员的 token 实现批量导出 markdown 文档。我的语雀知识库又可以实现免费迁移了&#xff0c;点个小星星支持一下。 说明&#xff1a; 这是一个基于puppeteer 来模拟用户在浏览器的操作…

基于深度强化学习的目标驱动型视觉导航泛化模型

深度强化学习在目标驱动型视觉导航的泛化 参考论文《Towards Generalization in Target-Driven Visual Navigation by Using Deep Reinforcement Learning》 文章目录 深度强化学习在目标驱动型视觉导航的泛化1. 目标驱动型视觉导航问题2. 创新点和解决的问题2.1 创新点2.2 解…

随身WIFI折腾日记(四)---拓展USB接口读取U盘内容

五、USB行为控制 随身WIFI对外交互的接口只有WIFI和USB接口。如果要想接入其他硬件设备&#xff0c;拓展USB接口至关重要&#xff0c;对于USB接口的控制&#xff0c;参考如下链接: openstick项目官方教程:控制usb行为 HandsomeMod/gc: A Simple Tool To Control Usb Gadget …

Opencv C++图像处理:点多边形测试 + 矩 + 凸包 + 映射 + 反向投影

文章目录 1、点多边形测试1.1、计算像素点是在轮廓内部、外部或边界上&#xff1a;cv::pointPolygonTest()1.2、计算最小值和最大值及其位置&#xff1a;cv::minMaxLoc()1.3、实战案例 2、矩2.1、计算多边形或光栅化形状的三阶以下的所有力矩&#xff1a;cv::moments()2.2、计算…

Regularization

在图像中的特征处理&#xff1a; 平均亮度的去除 SVD Whiten PCA 参数初始化策略 数据归一化&#xff1a; 标准归一化缩放归一化PCA/SVD 数据归一化对梯度的影响 归一化后&#xff0c;可以更快的搜索到最优值点 正则化 数据增强与早停 图像数据的增强主要是通过算法…

测试新手如何去学习接口自动化测试 ?从这一套测试框架开始 。

接口自动化测试框架系列之整体介绍 1.接口自动化测试1.自动化框架概述2.搭建自动化测试框架3.测试框架中所使用到的技术 1.接口自动化测试 自动化测试虽然是测试中比较热的一门技术 &#xff0c;但凡一个测试岗位&#xff0c;你几乎都能看到有自动化测试的要求 。但不得不说&a…

关于深度学习方面的一些概念

1、自学习&#xff08;self-taught learning&#xff09;与半监督学习   自学习(self-taughtlearning)是不要求未标注数据 X u X_u Xu​和已标注数据 X l X_l Xl​来自同样的分布。另外一种带限制性的方式也被称为半监督学习&#xff0c;它要求 X u X_u Xu​和 X l X_l Xl​服…

[快速入门前端17] CSS 选择器(6) 选择器总结

基本选择器 选择器说明语法通配符作用范围为所有标签&#xff0c;用于页面整体样式* { color: red }元素作用于同种标签&#xff0c;不能进行差异化样式设定p { color: red }类别作用于我们自行设定的类别&#xff0c;是使用频率最高的选择器.myClass { color: red }ID选取当前…

15JS06——流程控制-循环

目标&#xff1a; 1、循环 2、for循环 3、双重for循环 4、while循环 5、do while循环 6、continue break 7、命名规范以及语法格式 一、循环 1、循环的目的 可以重复执行某些代码 2、JS中的循环 for循环 while循环 do…while循环 二、for循环 在程序中&#xff0c;一…

机器学习 - 决策树

决策树是一种流程图&#xff0c;可以帮助我们根据以前的经验进行决策 比如&#xff0c;一个人将尝试决定他/她是否应该参加喜剧节目 下面是要用到的数据集 AgeExperienceRankNationalityGo36109UKNO42124USANO2346NNO5244USANO43218USAYES 读取并打印数据集 import pandas…

Transformer、Bert、Gpt对比系列,超详细介绍transformer的原理,bert和gpt的区别

一、Transformer架构图 Transformer 是一种用于序列到序列学习的神经网络模型&#xff0c;主要用于自然语言处理任务&#xff0c;如机器翻译、文本摘要等。它在2017年由 Google 提出&#xff0c;采用了注意力机制来对输入序列进行编码和解码。 Transformer 模型由编码器和解码…

随身WIFI折腾日记(五)---远程视频监控

六、远程视频监控 为了实现基于随身WIFI的网络摄像头&#xff0c;我参考了如下视频课程&#xff1a; 韦东山老师手把手带你从0开始自己做一个视频监控项目 系统由三部分组成&#xff1a;推流端(随身WIFI)、流媒体服务器(云服务器)、拉流端(浏览器/VLC播放器) 方案&#xff1…

NetworkInterface类

文章目录 1. 简介2. 工厂方法3. 获取方法 1. 简介 NetworkInterface类表示一个本地IP地址。这可以是一个物理接口&#xff0c;如额外的以太网卡&#xff08;常见于防火墙和路由器&#xff09;&#xff0c;也可以是一个虚拟接口&#xff0c;与机器的其它IP地址绑定到同个物理硬…

ensp实践dhcp服务

ensp实践dhcp服务 1、dhcp接口分配模式2、dhcp接口地址池分配模式3、dhcp布拉布拉布拉 1、dhcp接口分配模式 1.1、路由器AR1配置dhcp动态获取 <Huawei>system-view [Huawei]interface g0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 10.1.1.1 24 [Huawei-GigabitEthe…

PixiJS 源码解读:绘制矩形,底层都做了什么?

大家好&#xff0c;我是前端西瓜哥&#xff0c;今天带大家看一下 PixiJS 的源码实现。 PixiJS 是一个非常流行的 Canvas 库&#xff0c;start 数将近 4w。 使用 PixiJS 简单易用的 API&#xff0c;我们可以在浏览器页面的 Canvas 元素上高性能地绘制图形&#xff0c;实现流畅…

基于深度学习的交通标志检测和识别(从原理到环境配置/代码运行)

项目是一个基于Python和OpenCV的交通标志检测和识别项目,旨在使用计算机视觉和深度学习技术对交通标志进行检测和分类。本文将从介绍项目原理和框架开始,详细介绍该项目的实现过程和技术细节,最后给出项目的安装和使用方法。 前后结果对比 识别前 识别后 一、 项目原理和框…

随身WIFI折腾日记(一)---霓虹灯

引言 通过对高通410芯片的随身WIFI刷写Debain系统&#xff0c;我们已经拥有了一台带4G功能的迷你ARM64单板电脑。现在我们可以基于此此平台进行一下二次开发。 随身WIFI的优势就是价格低廉&#xff0c;性能和树莓派zero2、树莓派3b差不多。 硬件配置如下&#xff1a; msm89…

随身WIFI折腾日记(二)---文件传输和软件安装

二、文件传输 我们可以通过SCP和SFTP工具和随身WIFI(USB连接)进行数据传输&#xff0c;上图以scp工具为例。 将本地电脑文件传输至随身WIFI&#xff0c;本地电脑上输入如下指令即可&#xff1a; scp /path/to/local/file user192.168.68.1:/path/to/remote/directory/注意&…

RK3568平台开发系列讲解(驱动基础篇)10min带你获取、了解与编译Kernel源代码

🚀返回专栏总目录 文章目录 一、Kernel获取二、Kernel根目录2.1 Documentation/2.1 arch/2.2 block/2.3 boot.its2.4 drivers/2.5 firmware/2.6 fs/2.7 include/2.8 init/2.9 ipc/2.10 kernel/2.11 lib/2.12 lo

(转载)从0开始学matlab(第13天)—画图进阶

我们将讨论简单的二维图象(之前已有所介绍)的附加特性。这些特性将允许我们控制 x&#xff0c;y 轴上的值的范围&#xff0c;在一个坐标系内打印多个图象&#xff0c;或创建多个图&#xff0c;或在一个图象窗口内创建多个子图像&#xff0c;或提供更加强大的轨迹文本字符控制。…