前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过源码分析Spring Security用户认证流程

通过源码分析Spring Security用户认证流程

作者头像
Dream城堡
发布2022-01-07 17:25:57
4180
发布2022-01-07 17:25:57
举报
文章被收录于专栏:Spring相关

Spring Security的登录主要是由一系列的过滤器组成,我们如果需要修改登录的校验逻辑,只需要在过滤器链路上添加修改相关的逻辑即可。这里主要通过Spring Security的源码来了解相关的认证登录的逻辑。

1.Spring Security的认证流程

主要分析:

  1. 认证用户的流程
  2. 如何进行认证校验
  3. 认证成功后怎么获取用户信息

具体的过滤器链路如下所示:

coM5a4.png
coM5a4.png

Spring Security的认证流程图如下,认证的主要过程有:

  1. 用户提交用户名和密码,然后通过UsernamePasswordAuthenticationFilter对其进行封装成为UsernamePasswordAuthenticationToken对象,这个是AbstractAuthenticationToken的子类,而AbstractAuthenticationToken又是Authentication的一个实现,所以可以看到后续获取的都是Authentication类型的对象实例;
  2. 将第一步的UsernamePasswordAuthenticationToken对象传递给AuthenticationManager;
  3. 通过AbstractUserDetailsAuthenticationProvider的默认实现类DaoAuthenticationProvider的retrieveUser方法,这个方法会调用UserDetailsService的loadUserByUsername方法来进行用户名和密码的判断,使用的默认的逻辑进行处理;
  4. 将成功认证后的用户信息放入到SecurityContextHolder中,之后可以通过SecurityContext获取用户的相关信息。
coGpvR.png
coGpvR.png

spring-security源码下载地址:

代码语言:javascript
复制
https://github.com/spring-projects/spring-security
2.Spring Security的认证源码分析
2.1 搭建项目并访问

首先我们搭建一个Spring Security的项目,使用Spring Boot可以很方便的进行集成开发,主要引入如下的依赖即可(当然也可以查看官网,选择合适的版本):

代码语言:javascript
复制
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

启动项目后会随机生成一个密码串,这里需要复制保存以便登录的时候使用:

coJ0ld.png
coJ0ld.png

访问登录地址:

代码语言:javascript
复制
http://localhost:8080/login
coJfpQ.png
coJfpQ.png

默认的账户名和密码:

代码语言:javascript
复制
账户名: user
密码:   项目启动时生成的密码串
2.2 进行源码分析
  1. 进行断点后会发现首先进入的是UsernamePasswordAuthenticationFilter的attemptAuthentication(HttpServletRequest request, HttpServletResponse response)方法,会对用户名和密码进行封装成UsernamePasswordAuthenticationToken对象,然后调用this.getAuthenticationManager().authenticate(authRequest)方法进入到AuthenticationManager中。 attemptAuthentication方法源码如下所示:
代码语言:javascript
复制
@Override
	public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
			throws AuthenticationException {
		if (this.postOnly && !request.getMethod().equals("POST")) {
			throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
		}
		String username = obtainUsername(request);
		username = (username != null) ? username : "";
		username = username.trim();
		String password = obtainPassword(request);
		password = (password != null) ? password : "";
		UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
		// Allow subclasses to set the "details" property
		setDetails(request, authRequest);
		return this.getAuthenticationManager().authenticate(authRequest);
	}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/04/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Spring Security的认证流程
  • 2.Spring Security的认证源码分析
    • 2.1 搭建项目并访问
      • 2.2 进行源码分析
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档