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

news2025/1/11 9:52:49

一、导入所需依赖

 <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

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

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

相关文章

机械学习—零基础学习日志(如何理解概率论5)

这里我们学习随机变量的独立性 我们这里也来一个习题。 《概率论与数理统计期末不挂科|考研零基础入门4小时完整版&#xff08;王志超&#xff09;》学习笔记 王志超老师 &#xff08;UP主&#xff09;

旧物上门回收系统架构分析

随着环保意识的增强和资源循环利用的重视&#xff0c;旧物上门回收系统逐渐成为现代城市生活的一部分。这些系统通过先进的技术架构&#xff0c;实现了废品的高效回收与再利用&#xff0c;为环境保护和可持续发展做出了积极贡献。本文将从系统架构的角度&#xff0c;对旧物上门…

Linux--网络层 IP协议

目录 0.往期文章 1.IP基本概念 2. IP协议报头格式 3.网段划分 两种网段划分的方式 为什么要进行网段划分 4.特殊的IP 地址 5.IP 地址的数量限制 6.私有 IP 地址和公网 IP 地址*** NAT技术 认识公网 运营商扮演的角色 7.路由 8.16位标识&#xff0c;3为标志和13位…

leetcode:2733. 既不是最小值也不是最大值(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;数组由 不同正整数 组成&#xff0c;请你找出并返回数组中 任一 既不是 最小值 也不是 最大值 的数字&#xff0c;如果不存在这样的数字&#xff0c;返回 -1 。 返回所选整数。 示例 1&#xff1a; 输入&#xff1a;nu…

vue3【组件封装】日历 (默认标注今日,可选择日期,可标注日期,可切换月份,样式仿 Win11)

效果预览 技术要点 获取每个月最后一天 下个月的第0天,自动会被解析为本月的最后一天 let lastDay = computed(() => new Date(year.value, month.value, 0).getDate());flex 布局末行左对齐 最靠谱的方式是想办法将末行缺失元素填满 本范例中,因星期固定7列,按每月最…

Centos7.6-DNS服务安装与配置

1、安装bind 软件包 首先&#xff0c;需要安装 bind 软件包&#xff0c;这可以通过运行以下命令来完成&#xff1a; [rootlocalhost ~]# yum install bind 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile* base: mirrors.aliyun…

string转nlohmann::json问题

如果用字符串赋值构造函数&#xff0c;出现如下问题&#xff1a; std::string message; ​​nlohmann::json info(message); 如果按照如下代码则是正常的&#xff1a; std::string message; ​​nlohmann::json info nlohmann::json::parse(message);

Vue项目创建和使用

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

FPGA开发——verilog的运算符以及相关优先级的介绍

一、简介 在我们学习任何一门编程语言时&#xff0c;不可避免的都会遇见运算符和相关的运算优先级的问题&#xff0c;只有掌握了各个运算符的优先级关系我们才能进行更好的代码编写。在前面的时候因为我没有遇到因为优先级而导致的工程结果错误&#xff0c;所以没有过多注意&am…

振兴杯全国青年职业技能大赛职业技能标准——物联网安装调试员

一、大赛概述 1.1 振兴杯全国青年职业技能大赛简介 振兴杯全国青年职业技能大赛是一项国家级的职业技能竞赛&#xff0c;自2005年首届大赛成功举办以来&#xff0c;已逐渐成为国内规模最大、影响力最广的青年职业技能竞赛之一。这项竞赛旨在推动青年技能人才的培养和发展&…

软件测试面试题与经验分享【附文档】

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 参考答案&#xff1a; 兼容测试主要是检查软件在不同的硬件平台、软…

黄金市场波动加剧美联储降息预期与数据修正共舞

美联储鸽派信号提振金价 周四亚市盘中&#xff0c;现货黄金价格突然加速回落&#xff0c;逼近2500美元/盎司关键支撑位&#xff0c;日内重挫逾10美元。尽管如此&#xff0c;美联储周三发布的鸽派会议纪要显示&#xff0c;政策制定者普遍倾向于9月降息&#xff0c;为金价提供了…

linux系统,ubuntu安装英伟达NVIDIA4090显卡驱动

文章目录 前言下载英伟达NVIDIA官方驱动安装NVIDIA驱动远程安装关闭交互界面设置权限&#xff08;自己确认版本号5&#xff09;安装&#xff08;自己确认版本号5&#xff09;打开交互界面&#xff0c;并重启系统验证是否安装成功 异常处理问题1问题2问题3&#xff08;可能没解决…

docker手动部署django项目Dockerfile编排-后端发布

1、首先创建一个桥接网络 docker network create auto 2、部署redis,提供celery的消息队列服务 docker run --name redis --restartalways -d --network auto -v redis:/data redis:alpine3、部署数据库 注意数据库账号密码 docker run --name mariadb --restartalways -d…

vue3+ts+vant4 列表下拉刷新+分页加载

效果图 主要代码&#xff1a; <van-pull-refreshv-model"refreshing"refresh"handleRefresh"pulling-text"下拉释放刷新"loosing-text"下拉释放刷新"loading-text"加载中"><van-listv-model:loading"loading…

DDD精粹速读(一)

1 你需要知道的 - 战略设计 DDD是一种软件设计和构建方法&#xff0c;其重点在于独立于数据持久化等技术问题&#xff0c;准确表达业务规则。 不幸&#xff0c;DDD 对新手来说极具挑战性&#xff0c;部分原因是它有许多独特的概念需要学习。本文我简要介绍这些重要的思想&…

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我&#xff0c;学校要求参加数模比赛&#xff0c;但是不擅长建模编程&#xff0c;但又不想浪费这个时间该怎么办呢&#xff0c;今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

【QT】学习笔记:关于“初始化列表中的成员变量”

一、问题1 以下代码是什么意思&#xff1f; MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow() {delete ui; } 好的&#xff0c;我来为你解释这段 Qt 代码&#xff1a; 整体概述…

Linux(面试篇)

目录 什么是Linux 什么是Linux内核&#xff1f; Linux的基本组件是什么&#xff1f; Bash和Dos之间基本区别是什么&#xff1f; 什么是Root账户 什么是Bash? 什么时CLI? Linux的目录结构时怎样的&#xff1f; 什么是硬链接和软链接&#xff1f; 什么叫CC攻击&#…

景联文科技:专业人像采集服务,助力人像采集在多领域应用

随着社会的数字化和智能化进程不断推进&#xff0c;人像采集在多个领域中扮演着至关重要的角色&#xff0c;不仅可以提升安全性&#xff0c;还为人们的日常生活带来了更多的便捷。 应用场景&#xff1a; 1. 身份验证与生物识别&#xff1a; 机场、火车站等交通枢纽的身份核验…