Spring Security学习(四)——登陆认证(包括自定义登录页)

前言

和前面的文章隔了很长时间才更新Spring Security系列,主要原因一个是之前太忙了,把项目都忙完了,赶上春节假期,就慢慢研究。Spring Security的体系非常复杂,一口吃不了热豆腐,没办法速成,也不是三两句话就能讲清楚。即使复制别人的配置,但需要稍作修改的时候怎么办?Spring Security看似简洁的配置,其实包含了大量默认配置内容,也存在很多可以扩展的空间。所以首先得会用基本的配置,然后还要窥探源码,了解其内部原理,才能玩转这个框架。

在《Spring Security学习(一)——快速开始》中我们看到即使什么都不配置,Spring Security也会为我们提供一个默认的登录页。所以会有几个疑问:1、我们如何自定义登录页?2、是否有其他登陆方式?

虽然现在Vue+SpringBoot体系下基本不需要配置这个内容,不过作为学习的角度,了解怎么回事还是很有必要的,能看懂很多例子的配置是怎么回事。

我们的代码可以基于《Spring Security学习(一)——快速开始》之上添加,建应用的步骤直接参考前文即可,本文不再赘述。

登陆提交账号密码的三种方式

Spring Security提供了三种提交账号密码给框架的方式。如果我们不用vue,只用thymeleaf做页面的话,就可以使用这个功能。这三种方式为:表单方式、httpBasic方式、摘要方式。

在配置这几种方式前,我们先新建一个Spring Security的配置类WebSecurityConfig:

@EnableWebSecurity
public class WebSecurityConfig{}

 后面Spring Security的相关配置都会在WebSecurityConfig类进行配置

表单方式

表单方式的认证过程,我们通过官网的图稍微说明一下:

上图是表单认证重定向过程的步骤:

  1. 第一步用户要访问 /private 路径,经过SecurityFilterChain的过滤;
  2. FilterSecurityInterceptor判断用户未登陆,则抛出异常AccessDeniedException;
  3. ExceptionTranslationFilter重定向到登录页,这个登录页由AuthenticationEntryPoint配置,通常会以LoginUrlAuthenticationEntryPoint作为其实现;
  4. 浏览器请求登录页访问;
  5. 应用返回具体的登录页。

 这个过程不复杂,会涉及到一些拦截器、过滤器等。这告诉我们存在哪些扩展空间,当然我们暂时还不需要用到。我们可以看到想要Spring Security要怎么认证,我们就给它配置什么样的SecurityFilterChain就可以了。

默认登录页的配置方式

如果我们仅仅希望使用默认登录页的效果,以下配置就可以了:

@EnableWebSecurity
public class WebSecurityConfig{@Bean                                                            public SecurityFilterChain formLoginFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).formLogin(Customizer.withDefaults());return http.build();}
}

7-8行配置意思是对于任意请求都要进行认证。如果不配置这个的话,Spring Security就不会拦截任何访问。第9行就是配置默认登录页。配置非常简便。

自定义登录页的配置方式

如果我们不想用默认的登录页呢?配置也很简单:

@EnableWebSecurity
public class WebSecurityConfig{@Bean                                                            public SecurityFilterChain formLoginFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).formLogin(form -> form.loginPage("/login").permitAll());return http.build();}
}

仅仅改成10-13行的配置就可以了。当然我们还要写一个自定义的登录页,以及访问登录页的controller。下面在resources/templates下新建loginPage.html登录页:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"><head><title>Please Log In</title></head><body><h1>请登录</h1><div th:if="${param.error}">Invalid username and password.</div><div th:if="${param.logout}">You have been logged out.</div><form th:action="@{/login}" method="post"><div><input type="text" name="username" placeholder="Username"/></div><div><input type="password" name="password" placeholder="Password"/></div><input type="submit" value="Log in" /></form></body>
</html>

我们还要修改一下配置,让应用能找到页面的位置,修改application.yml,增加thymeleaf的路径配置:

spring:thymeleaf:prefix: classpath:/templates/

之后建一个controller返回登陆页:

@Controller
public class LoginController {@GetMapping("/login")String login() {return "loginPage";}
}

启动程序,访问http://localhost:8080/hello会重定向到/login路径返回自定义登录页:

由于我们没配置账号密码,所以使用《Spring Security学习(一)——快速开始》里说的默认账号密码,账号user,密码是应用启动时随机生成的,在控制台可以查看。

httpBasic方式

除了表单方式,也可以用默认的httpBasic方式,在WebSecurityConfig中配置:

@EnableWebSecurity
public class WebSecurityConfig{@Bean                                                            public SecurityFilterChain formLoginFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated()).httpBasic(Customizer.withDefaults());return http.build();}
}

第10行改成配置为httpBasic方式。然后我们访问http://localhost:8080/hello:

浏览器会弹出登陆框让我们让我们输入账号密码。

摘要方式 

这块暂时没有研究,因为Spring Security官方文档一开头就说不建议在现代应用中使用这种安全方案,所以就不作介绍了。

小结

本文主要总结了Spring Security中提交账号的方式,其中自定义登录页可以适用于thymeleaf为前端的轻应用。不过对于使用vue作为前端的应用不需要配置登陆提交方式。后面的文章会继续Spring Security研究其他方面的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift Combine 使用 flatMap 和 catch错误处理 从入门到精通十三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

浅谈应该遵守的伦敦银交易规则

做伦敦银投资的朋友应遵守伦敦银交易规则&#xff0c;伦敦银交易规则不是指那些伦敦银交易技巧&#xff0c;而是在这个市场中要遵循的一些约定&#xff0c;下面我们就来讨论一下。 风险管理。风险管理即指投资者控制自己一笔乃至整体交易的风险&#xff0c;没有风险管理意识的投…

顾问聘请协议(模板)

甲方&#xff1a;________________   乙方&#xff1a;________________ 诚信合作是一切事业发展的基础&#xff0c;外部智力是企业进步的源泉。甲、乙双方经友好协商达成本协议&#xff0c;甲方愿意聘请乙方为特邀管理顾问&#xff0c;乙方愿按本协议内容与甲方合作。 一、合…

《区块链公链数据分析简易速速上手小册》第6章:区块链数据的应用(2024 最新版)

文章目录 6.1 市场趋势分析6.1.1 基础知识6.1.2 重点案例&#xff1a;分析比特币市场趋势准备工作实现步骤步骤1: 加载和预处理数据步骤2: 可视化价格和交易量趋势步骤3: 分析链上活动步骤4: 综合分析 结论 6.1.3 拓展案例 1&#xff1a;链上活动分析准备工作实现步骤步骤1: 加…

【Web】NSSCTF Round#18 Basic个人wp(部分)

目录 ①门酱想玩什么呢&#xff1f; ②Becomeroot ①门酱想玩什么呢&#xff1f; 先试一下随便给个链接 不能访问远程链接&#xff0c;结合评论区功能&#xff0c;不难联想到xss&#xff0c;只要给个评论区链接让门酱访问就可 我们研究下评论区 从评论区知道&#xff0c;要…

【双指针】【C++算法】1537. 最大得分

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 双指针 LeetCoce 1537. 最大得分 你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。 一条 合法路径 定义如下&#xff1a; 选择数组 nums1 或者 nums2 开始遍历&…

【linux内核调试及根文件系统】

linux内核分成两个部分&#xff0c;一个是逻辑代码存于驱动代码&#xff0c;一个是硬件信息存于设备树 linux内核分成两个部分一部分为逻辑代码放在uimage&#xff0c;另一部分硬件信息放在设备树

Stable Diffusion之最全详解图解

Stable Diffusion之最全详解图解 1. Stable Diffusion介绍1.1 研究背景1.2 学术名词 2.Stable Diffusion原理解析2.1 技术架构2.2 原理介绍扩散过程 3.1 Diffusion前向过程3.2 Diffusion逆向&#xff08;推断&#xff09;过程 1. Stable Diffusion介绍 Stable Diffusion是2022…

【AIGC使用教程】Notion AI 从注册到体验:如何免费使用

欢迎关注【AIGC使用教程】 专栏 【AIGC使用教程】SciSpace 论文阅读神器 【AIGC使用教程】Microsoft Edge/Bing Chat 注册使用完全指南 【AIGC使用教程】GitHub Copilot 免费注册及在 VS Code 中的安装使用 【AIGC使用教程】GitHub Copilot 免费注册及在 PyCharm 中的安装使用 …

几个经典金融理论

完整EA&#xff1a;Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 一、预期效用理论 预期效用理论是描述人们在做出决策时如何考虑风险和不确定性的一种理论。该理论最初由经济学家冯诺伊曼&#xff08;John von Neumann&#xff09;和奥斯卡摩根斯坦恩&#xff08;Oskar…

4核8G服务器配置性能怎么样?12M带宽配置服务器能干什么?

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

OpenCV基础:用Python生成一幅黑白图像

使用Python&#xff1a;生成一幅左黑右白的灰度图像&#xff0c;图像大小为1616像素。借助OpenCV库。输出数值&#xff0c;并显示图像。 # -*- coding: utf-8 -*- """ Created on Wed Feb 14 21:45:45 2024author: 李立宗公众号&#xff1a;计算机视觉之光知识…