【若依】开源框架学习笔记 07 - 登录认证流程(Spring Security 源码)

一、概述

本文主要整理了若依框架中有关登录认证的功能流程。

需要特别说明一下的是,本文是综合了B站视频以及他人博客整理的笔记,所以有些地方可能不能很好地说明,还望见谅。

二、登录过程代码实现

登录接口
com.ruoyi.web.controller.system.SysLoginController#login(LoginBody)
在这里插入图片描述
登录验证方法
com.ruoyi.framework.web.service.SysLoginService.login(String, String, String, String)
在这里插入图片描述
在这里插入图片描述
由上图,用户验证方法,注释中有写 “该方法会去调用UserDetailsServiceImpl.loadUserByUsername”,这里放到下面验证流程再详细说明。

三、用户验证流程(Spring Security 源码)

对于这一部分,我推荐看下B站视频:
尚硅谷SpringSecurity框架教程(spring security源码剖析从入门到精通)

还有一篇博客(写得很详细,但是需要梯子),也是下面这张图的来源:
Spring-Security登录认证授权原理
在这里插入图片描述
重要的事情说三遍:

  • 请跟着这张图来分析~
  • 请跟着这张图来分析~
  • 请跟着这张图来分析~
1、处理用户认证逻辑过滤器 UsernamePasswordAuthenticationFilter
public Authentication attemptAuthentication(HttpServletRequest request,
		HttpServletResponse response) throws AuthenticationException {
	// 默认的登录请求 url 是"/login",并且只允许 POST 方式的请求
	if (postOnly && !request.getMethod().equals("POST")) {
		throw new AuthenticationServiceException(
				"Authentication method not supported: " + request.getMethod());
	}

	// 从 HttpServletRequest 中获取用户名、密码
	String username = obtainUsername(request);
	String password = obtainPassword(request);

	if (username == null) {
		username = "";
	}

	if (password == null) {
		password = "";
	}

	username = username.trim();

	// 创建 UsernamePasswordAuthenticationToken 对象
	// 任何希望创建 UsernamePasswordAuthenticationToken 的代码都可以安全地使用此构造函数,因为 isAuthenticated() 将返回 false。
	UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
			username, password);

	// 提供以便子类可以配置放入身份验证请求的详细信息属性中的内容。
	// Allow subclasses to set the "details" property
	setDetails(request, authRequest);

	// 获取 AuthenticationManager,调用认证方法
	return this.getAuthenticationManager().authenticate(authRequest);
}
2、ProviderManager

AuthenticationManager 实现类 ProviderManager
在这里插入图片描述
查看 authenticate(Authentication) 方法:
在这里插入图片描述
通过 for 循环遍历 AuthenticationProvider 对象的集合,找到支持当前认证方式的 AuthenticationProvider,找到之后调用该 AuthenticationProviderauthenticate 方法进行认证处理。

3、处理用户认证接口 AuthenticationProvider

在这里插入图片描述
接口方法:

  • 认证方法 authenticate
  • 是否支持某种类型token的方法 supports
    在这里插入图片描述
4、用户认证实现类 AbstractUserDetailsAuthenticationProvider

AbstractUserDetailsAuthenticationProvider 抽象类,查看 supports 方法:
在这里插入图片描述
说明支持 UsernamePasswordAuthenticationToken 类型。

查看 authenticate(Authentication) 方法:
在这里插入图片描述
由上图,从缓存中获取 UserDetails ,如果没有则调用 retrieveUser 方法获取。

UserDetails 是保存用户信息的接口。若依中的 LoginUser 也实现了这个接口用于保存登录用户的相关信息。
在这里插入图片描述
接着往下查看 authenticate(Authentication) 方法:
在这里插入图片描述
预检查 preAuthenticationChecks
在这里插入图片描述
附加检查 additionalAuthenticationChecks 是一个抽象方法,稍后再看子类具体实现。

后检查 postAuthenticationChecks
在这里插入图片描述
如果上面的检查都通过并且没有异常,表示认证通过,会调用下面的方法:
createSuccessAuthentication(principalToReturn, authentication, user);
在这里插入图片描述
此时会调用父类的构造方法设置权限信息,并调用父类的 setAuthenticated(true) 方法,到这里就表示认证通过了。
在这里插入图片描述

5、用户认证实现类子类 DaoAuthenticationProvider

附加检查 additionalAuthenticationChecks 实现:
在这里插入图片描述
获取用户信息 UserDetails 的方法 retrieveUser
在这里插入图片描述
this.getUserDetailsService() 获取的 UserDetailsService 是一个接口,若依也实现了该接口。
在这里插入图片描述
至此,终于到刚才第二部分所说的 UserDetailsServiceImpl.loadUserByUsername 的实现。
在这里插入图片描述

四、认证信息共享

1、AbstractAuthenticationProcessingFilter

在这里插入图片描述
进入 SecurityContextHolder.getContext()
在这里插入图片描述
在这里插入图片描述

2、SecurityContextPersistenceFilter

在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
好的,现在我们来讨论一下整合flowable流程开源框架——flowable笔记的环境配置。在开始配置之前,我们需要确保已经安装了以下软件: - JDK 8 或以上版本 - Maven 3.3 或以上版本 - Git 接下来,我们可以按照以下步骤进行环境配置: 1. 克隆 flowable笔记 项目 ```bash git clone https://github.com/flowable/flowable-engine.git ``` 2. 进入项目目录 ```bash cd flowable-engine ``` 3. 切换到需要的分支 ```bash git checkout 6.6.0 ``` 4. 构建项目 ```bash mvn clean install -DskipTests ``` 5. 配置数据库 在 `$FLOWABLE_HOME/modules/flowable-ui-admin/flowable-ui-admin-app/src/main/resources/application.yml` 文件中,找到以下配置: ```yaml spring: datasource: url: jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1 driverClassName: org.h2.Driver username: sa password: ``` 修改为: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/flowable?characterEncoding=UTF-8 driverClassName: com.mysql.jdbc.Driver username: root password: root ``` 其中,`jdbc:mysql://localhost:3306/flowable` 表示数据库的连接地址,`com.mysql.jdbc.Driver` 表示数据库驱动程序的类名,`root` 表示数据库的用户名和密码。 6. 运行项目 ```bash cd modules/flowable-ui-admin/flowable-ui-admin-app mvn spring-boot:run ``` 7. 访问项目 在浏览器中输入 `http://localhost:8080/flowable-ui/admin`,即可访问 flowable笔记 项目的管理界面。 以上就是整合flowable流程开源框架——flowable笔记的环境配置步骤。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MichelleChung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值