spring security 入门基础,表单认证web页面跳转

一、导入所需依赖

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
    </parent>

  <!-- web 支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- SpringSecurity依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- thymeleaf 模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

二、配置security 的用户名和密码

#配置security 的用户名和密码
spring:
  security:
    user:
     name: root
     password: 1234

如果不知道该地方为什么这么配置,请移步上一篇文章,连接地址初识spring security (一),一文弄懂默认配置-CSDN博客

三、基于web方式开发,页面跳转配置

 传统web应用开发,登录成功我们会做一次 redirect 或者一个forward 的操作,重新到一个新的页面,如主页等;

3.1 自定义登录页面地址,替换自带的登录框

 重写 WebSecurityConfigurerAdapter中的configure(HttpSecurity http) 使其默认的表单登录验证失效;

3.1.1  配置登录的url以及放行路径

http.csrf().disable();//关闭csrf 防护

        http.authorizeRequests()

                .mvcMatchers("/index.page").permitAll()//放行登录页面,放行的需要写到前面,不放行的写到后面

                .anyRequest().authenticated()// 除了上面这个路径放行,后面所有的都需要认证

                .and()

                .formLogin()// 表单登录验证

                .usernameParameter("loginId")// 自定义登录用户名参数

                .passwordParameter("pwd")// 自定义登录密码参数

                .loginPage("/index.page")// 用来指定默认的登录页面,注意一旦自定义登录页面以后必须只能登录url

                .loginProcessingUrl("/doLogin") //指定登录请求url

                .successForwardUrl("/main/index.page");// 登录成功后,forward 的页面,区别在于地址栏还是 doLogin而不是 /main/index.page

3.2 定义登录成功后的页面跳转

1.使用 .successForwardUrl("/main/index.page");方式,该方式类似于一个 forward 在内部跳转,从下面图中我们观察到,这个跳转的url实际上是表单的action地址

3.2.1 .successForwardUrl("/main/index.page");

3.2.2.1 效果图

3.2.2  .defaultSuccessUrl("/main/index.page")

使用.defaultSuccessUrl("/main/index.page"); 跳转,实际上内部是使用了一个SavedRequestAwareAuthenticationSuccessHandler 处理,我们看到是内部进行了一个redirect的操作,我们之前登录第doLogin 现在直接是我们之前访问的一个资源,该方法有一个重载参数,默认是false 意思为,访问时候会带上上一次请求的资源路径,当登录成功后,会重定向最开始访问的资源;浏览器本来是请求 /hello.do 请求,登录成功后,立马重定向 hello.do页面了,没有使用的默认成功页面 main/index.page页面

3.2.2.1 效果图

3.2.3 defaultSuccessUrl("/main/index.page",true)

我们发现我本来访问的是受限资源 /hello.do资源,但是还是给我跳到了 main/index.page的页面了 ,所以2 和3的区别就是,是否每次都需要用自己定义的这个资源url,现在明白了两者之间的关系了吧;

3.2.3.1 效果图

3.2.4 AuthenticationSuccessHandler关系类图

从上可知,redirect用的是 SavedRequestAwareAuthenticationSuccessHandler ,而forwa 用的是 ForwardAuthenticationSuccessHandler


3.3 定义登录失败后的跳转

这个时候密码故意输错,这个时候又继续回到登录页面了,是不是有一个疑问,这错误信息怎么不展示呢,下面我们来跟随一下源码看如何拿到错误信息;

如果认证失败的话,进行一个redirect 跳转,具体看 3.3.6 断点

3.3.1  .failureUrl("/index.page") 失败后,我们让回到的页面

3.3.2 将登录错误信息展示到页面上,本节为源码

这个时候我们跟随断点来到了父类的 AbstractAuthenticationProcessingFilter看到了一个catche 方法unsuccessfulAuthentication(request, response, ex);

3.3.3 unsuccessfulAuthentication 方法 继续看里面方法

protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response,AuthenticationException failed)  

3.3.4 进到 onAuthenticationFailure 方法

public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,

AuthenticationException exception)

3.3.5 .defaultFailureUrl 变量

因为我们自己配置了,所以上面一个不会进入,我们看saveException 方法干了什么

3.3.6 可以看到错误信息一个放到request中,一个放到了session中

根据断点得知错误新的的key 为:SPRING_SECURITY_LAST_EXCEPTION ,那么是不是就可以取出错误信息展示到页面上就可以了呢,从而得到 failureUrl是一个redirect 操作;这个时候我们用thymeleaf 将错误信息展示出来就好了;

3.3.6.1 效果图

3.3.7 .failureForwardUrl("/index.page") 

根据上面源码得知,该错误信息肯定是放到request中了,可以直接获取,那么在thymeleaf中直接获取,同时观察浏览器url ,也是一个forword 还是登录的那个url

<h2 th:text="${SPRING_SECURITY_LAST_EXCEPTION }">错误信息</h2>

3.3.7.1 效果图

3.3.7.2 源码

3.3.8 AuthenticationFailureHandler 关系图

Forwor 用的是 ForwardAuthenticationFailureHandler

Redirect 用的是SimpleUrlAuthenticationFailureHandler

源码链接:

https://download.csdn.net/download/qq_36260963/89661265

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FPGA 综合笔记

仿真时阻塞赋值和非阻塞赋值 Use of Non-Blocking Assignment in Testbench : Verilog Use of Non-Blocking Assignment in Testbench : Verilog - Stack Overflow non-blocking assignment does not work as expected in Verilog non-blocking assignment does not work a…

Linux云计算 |【第二阶段】SECURITY-DAY3

主要内容&#xff1a; Prometheus监控服务器、Prometheus被监控端、Grafana监控可视化 补充&#xff1a;Zabbix监控软件不自带LNMP和DB数据库&#xff0c;需要自行手动安装配置&#xff1b;Prometheus监控软件自带WEB页面和DB数据库&#xff1b;Prometheus数据库为时序数据库&…

adaptive AUTOSAR UCM模块中SoftwareCluster与Software Package是什么样的关系,他们分别包含哪些元素?

在自适应AUTOSAR(Adaptive AUTOSAR)的更新和配置管理(UCM)模块中,SoftwareCluster和Software Package是软件更新过程中的两个关键概念,它们之间有着密切的关系: SoftwareCluster:通常指的是一组功能相关的软件组件,它们共同实现了车辆中的一个或多个特定功能。在UCM中…

柔性织物处理 | 山大宋锐老师 | 最新演讲

笔者是清华在读研究生&#xff0c;主要关注人形机器人、具身智能。将持续分享行业前沿动态、学者观点整理、论文阅读笔记、知识学习路线等。欢迎交流 最近听了宋老师的演讲&#xff0c;以下是学习整理。部分图截自直播&#xff0c;若模糊望见谅 演讲信息&#xff1a; 【会议】…

Python | Leetcode Python题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution:def canMeasureWater(self, x: int, y: int, z: int) -> bool:if x y < z:return Falseif x 0 or y 0:return z 0 or x y zreturn z % math.gcd(x, y) 0

实现BeanPostProcessor

文章目录 1.实现初始化方法1.目录2.InitializingBean.java3.MonsterService.java 实现初始化接口4.SunSpringApplicationContext.java 调用初始化方法5.测试 2.实现后置处理器1.目录2.BeanPostProcessor.java 后置处理器接口3.SunBeanProcessor.java 自定义后置处理器4.SunSpri…

ZMQ请求应答模型

案例一 这个案例的出处是ZMQ的官网。请求段发送Hello&#xff0c;应答端回复World。 ZMQ Request(client) #include <string> #include <iostream> #include <zmq.hpp>using namespace std; using namespace zmq; // 使用 zmq 命名空间int main() {// ini…

PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码

&#x1f680;轻创推客&#xff0c;营销新纪元 —— 集淘客与地推任务于一体的全能平台&#x1f310; &#x1f308;【开篇&#xff1a;营销新潮流&#xff0c;轻创推客引领未来】 在瞬息万变的营销世界里&#xff0c;你还在为寻找高效、全面的营销渠道而烦恼吗&#xff1f;&…

【STM32】C语言基础补充

学习过程中发现自己好些需要用到的C语言语法、特征都不太熟练了&#xff0c;特意记录一下&#xff0c;免得忘记了&#xff0c;以后遇到了新的也会继续更新 目录 1 全局变量 2 结构体 3 静态变量 4 memset()函数 5 使用8位的存储器存16位的数 1 全局变量…

汽车冷却液温度传感器

1、冷却液温度传感器的功能 发动机冷却液温度传感器&#xff0c;也称为ECT&#xff0c;是帮助保护发动机&#xff0c;提高发动机工作效率以及帮助发动机稳定运行的非常重要的传感器之一。 发动机冷却液温度 &#xff08;ECT&#xff09; 传感器用于测量发动机的冷却液温度&…

Vue项目创建和使用

快速上手 | Vue.js (vuejs.org) nodejs.org/ vue项目实质上是index.html页面和多个js文件的集合&#xff0c;最终解析后的html和js代码可以由浏览器解析运行&#xff1a; vue项目的创建&#xff0c;需要脚手架工具来搭建&#xff1b; 在编译的源码阶段&#xff0c;文件格式为.…

集团数字化转型方案(十二)

集团数字化转型方案致力于通过构建一个集成化的数字平台&#xff0c;全面应用大数据分析、人工智能、云计算和物联网等前沿技术&#xff0c;推动业务流程、管理模式和决策机制的全面升级。该方案将从业务流程的数字化改造开始&#xff0c;优化资源配置&#xff0c;提升运营效率…

MySQL的源码安装及基本部署(基于RHEL7.9)

这里源码安装mysql的5.7.44版本 一、源码安装 1.下载并解压mysql , 进入目录: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz tar xf mysql-boost-5.7.44.tar.gz cd mysql-5.7.44/ 2.准备好mysql编译安装依赖: yum install cmake g…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式&#xff1a;* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

[创业之路-140] :生产 - 生产流程概述

目录 前言&#xff1a; 一、生产流程的基本框架 二、生产流程的关键要素 前言&#xff1a; 生产流程是一个广泛的概念&#xff0c;它涵盖了从原材料投入到成品产出的全过程。 这个过程在不同行业和领域中有所不同&#xff0c;但通常都包括一系列有序的步骤和环节。 以下是…

WIN 10 添加右键菜单(VSCode 打开当前目录)

WIN 10 添加右键菜单&#xff08;VSCode 打开当前目录&#xff09; 前言最终效果操作步骤 前言 每次打开代码都需要先打开 VSCode&#xff0c;再选择最近打开的项目或者浏览打开项目&#xff0c;感觉比较难找。所以自己添加了右键命令。 最终效果 操作步骤 cmd 打开注册表 找…

C语言程序设计(初识C语言后部分)

十七&#xff0c;数组 1.一维数组的创建和初始化 1&#xff09;数组的创建 数组是一组相同类型元素的集合 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组大小 …

R语言统计分析——回归分析的改进措施

参考资料&#xff1a;R语言实战【第2版】 如果在回归诊断中发现了问题&#xff0c;我们该如何做&#xff1f;有四种方法可以处理违背回归假设的问题&#xff1a; ①删除观测点&#xff1b; ②变量变换&#xff1b; ③添加或删除变量&#xff1b; ④使用其他回归方法。 1、…

C语言 ——— 常见的动态内存错误(下篇)

目录 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟内存忘记释放&#xff08;内存泄漏&#xff09; 使用free释放一块动态开辟内存的一部分 代码演示&#xff1a; // 动态开辟10个整型空间 int* p (int*)malloc(sizeof(int) * 10);// 判断是…