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:

java 复制代码
@EnableWebSecurity
public class WebSecurityConfig{


}

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

表单方式

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

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

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

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

默认登录页的配置方式

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

java 复制代码
@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行就是配置默认登录页。配置非常简便。

自定义登录页的配置方式

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

java 复制代码
@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登录页:

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的路径配置:

html 复制代码
spring:
  thymeleaf:
    prefix: classpath:/templates/

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

java 复制代码
@Controller
public class LoginController {

	@GetMapping("/login")
	String login() {
		return "loginPage";
	}
}

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

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

httpBasic方式

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

java 复制代码
@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研究其他方面的内容。

相关推荐
西凉的悲伤2 天前
Spring Security + JWT 登录认证完整实践指南
java·后端·spring·spring security·jwt
Micro麦可乐3 天前
最新Spring Security实战教程(十)权限表达式进阶 - 在SpEL在安全控制中的高阶魔法
java·spring boot·后端·spring·spring security·spel表达式
消失的旧时光-19438 天前
企业认证与安全体系(五):Spring Security + JWT + Redis 企业级认证实战
redis·安全·spring·spring security·jwt
消失的旧时光-19439 天前
企业认证与安全体系(四):企业登录认证流程全解析——JWT、Redis、Spring Security 如何协同工作?
redis·安全·spring·spring security·jwt
智研数智工坊10 天前
SpringBoot4.0.6 + Security7.x + JWT 最新完整实战|无状态权限认证、统一异常处理、可直接落地
java·spring boot·spring security·jwt·权限认证
段ヤシ.10 天前
回顾Java知识点,面试题汇总Day17(持续更新)
java·springboot·spring security·shiro·mybatis-plus·jdbctemplate·spring data jpa
梵得儿SHI14 天前
SpringCloud 进阶拓展:Spring Security OAuth2+JWT 微服务统一认证授权全实战|生产级方案 + 源码解析 + 踩坑实录
spring·spring cloud·微服务·spring security·jwt·oauth2·统一认证授权
Devin~Y20 天前
互联网大厂 Java 面试实录:JVM、Spring Boot、MyBatis、Redis、Kafka、Spring AI、K8s 全链路追问小Y
java·jvm·spring boot·redis·kafka·mybatis·spring security
小坏讲微服务24 天前
SpringBoot4.0整合Spring Security+MyBatis Plus完整权限框架实现
java·spring·mybatis·spring security·mybatis plus·springboot4.0
Cry丶1 个月前
架构师实战:Spring Authorization Server 落地企业级“无感” SSO(附设计映射与源码级接口剖析)
spring·spring security·oauth2.0·authorization·sso·无感登录