SpringBoot集成Spring Security(7)——认证流程

在前面的六章中,介绍了 Spring Security 的基础使用,在继续深入向下的学习前,有必要理解清楚 Spring Security 的认证流程,这样才能理解为什么要这样写代码,也方便后续的扩展。

一、认证流程

上图是 Spring Security 认证流程的一部分,下面的讲解以上图为依据。

(1) 用户发起表单登录请求后,首先进入 UsernamePasswordAuthenticationFilter

在 UsernamePasswordAuthenticationFilter 中根据用户输入的用户名、密码构建了 UsernamePasswordAuthenticationToken,并将其交给 AuthenticationManager 来进行认证处理。

AuthenticationManager 本身不包含认证逻辑,其核心是用来管理所有的 AuthenticationProvider,通过交由合适的 AuthenticationProvider 来实现认证。

(2) 下面跳转到了 ProviderManager ,该类是 AuthenticationManager 的实现类:

我们知道不同的登录逻辑它的认证方式是不一样的,比如我们表单登录需要认证用户名和密码,但是当我们使用三方登录时就不需要验证密码。

Spring Security 支持多种认证逻辑,每一种认证逻辑的认证方式其实就是一种 AuthenticationProvider。通过 getProviders() 方法就能获取所有的 AuthenticationProvider,通过 provider.supports() 来判断 provider 是否支持当前的认证逻辑。

当选择好一个合适的 AuthenticationProvider 后,通过 provider.authenticate(authentication) 来让 AuthenticationProvider 进行认证。

(3) 传统表单登录的 AuthenticationProvider 主要是由 AbstractUserDetailsAuthenticationProvider 来进行处理的,我们来看下它的 authenticate()方法。

首先通过 retrieveUser() 方法读取到数据库中的用户信息:

user = retrieveUser(username,(UsernamePasswordAuthenticationToken) authentication);

retrieveUser() 的具体实现在 DaoAuthenticationProvider 中,代码如下:

当我们成功的读取 UserDetails 后,下面开始对其进行认证:

在上图中,我们可以看到认证校验分为 前校验附加校验后校验,如果任何一个校验出错,就会抛出相应的异常。所有校验都通过后,调用 createSuccessAuthentication() 返回认证信息。

在 createSuccessAuthentication 方法中,我们发现它重新 new 了一个 UsernamePasswordAuthenticationToken,因为到这里认证已经通过了,所以将 authorities 注入进去,并设置 authenticated 为 true,即需要认证。

(4)至此认证信息就被传递回 UsernamePasswordAuthenticationFilter 中,在 UsernamePasswordAuthenticationFilter 的父类 AbstractAuthenticationProcessingFilterdoFilter() 中,会根据认证的成功或者失败调用相应的 handler:

这里调用的 handler 实际就是在《SpringBoot集成Spring Security(6)——登录管理》中我们在配置文件中配置的 successHandler()failureHandler()

二、多个请求共享认证信息

Spring Security 通过 Session 来保存用户的认证信息,那么 Spring Security 到底是在什么时候将认证信息放入 Session,又在什么时候将认证信息从 Session 中取出来的呢?

下面将 Spring Security 的认证流程补充完整,如下图:

在上一节认证成功的 successfulAuthentication()方法中,有一行语句:

SecurityContextHolder.getContext().setAuthentication(authResult);

其实就是在这里将认证信息放入 Session 中。

查看 SecurityContext 源码,发现内部就是对 Authentication 的封装,提供了 equals、hashcode、toString等方法,而SecurityContextHolder 可以理解为线程中的 ThreadLocal

我们知道一个 HTTP 请求和响应都是在一个线程中执行,因此在整个处理的任何一个方法中都可以通过 SecurityContextHolder.getContext()来取得存放进去的认证信息。

从 Session 中对认证信息的处理由 SecurityContextPersistenceFilter 来处理,它位于 Spring Security 过滤器链的最前面,它的主要作用是:

  • 当请求时,检查 Session 中是否存在 SecurityContext,如果有将其放入到线程中。
  • 当响应时,检查线程中是否存在 SecurityContext,如果有将其放入到 Session 中。

三、获取用户认证信息

通过调用 SecurityContextHolder.getContext().getAuthentication() 就能够取得认证信息:

@GetMapping("/me")
@ResponseBody
public Object me() {
    return SecurityContextHolder.getContext().getAuthentication();
}

上面的写法有点啰嗦,我们可以简写成下面这种, Spring MVC 会自动帮我们从 Spring Security 中注入:

@GetMapping("/me")
@ResponseBody
public Object me(Authentication authentication) {
    return authentication;
}

如果你仅想获取 UserDetails 对象,也是可以的,写法如下:

@GetMapping("/me")
@ResponseBody
public Object me(@AuthenticationPrincipal UserDetails userDetails) {
    return userDetails;
}

已标记关键词 清除标记
<span style="font-size:16px;">Spring Security 为基于J2EE企业应用提供全面安全服务。Spring Security3是最新的J2EE安全解决方案。</span><br /><span style="font-size:16px;"> </span><br /><span style="font-size:16px;">课程探讨如何对WEB请求做安全控制,内容如下:</span><br /><span style="font-size:16px;">1.轻松入门:</span><br /><span style="font-size:16px;">构建基于security的权限控制工程</span><br /><span style="font-size:16px;">基于用户名和密码的用户验证</span><br /><span style="font-size:16px;">基于默认、自定义数据库表结构的用户验证</span><br /><span style="font-size:16px;">开启rember-me功能</span><br /><span style="font-size:16px;">URL的匿名访问控制</span><br /><span style="font-size:16px;">自定义的登录页面。</span><br /><span style="font-size:16px;"> </span><br /><span style="font-size:16px;">2.深入探讨web请求的安全控制:</span><br /><span style="font-size:16px;">过滤器链机制</span><br /><span style="font-size:16px;">默认过滤器的作用</span><br /><span style="font-size:16px;">自定义的过滤器链。</span><br /><br /><span style="font-size:16px;">3.,1<span style="font-size:16px;">常见的网站攻击及预防1:</span></span><br /><span style="font-size:16px;">SQL注入攻击,</span><br /><span style="font-size:16px;">用户密码加强保护,</span><br /><p> <span style="font-size:16px;">XSS漏洞</span> </p> <p> <span style="font-size:16px;"><br /></span> </p> <p> <span style="font-size:16px;">3.2<span style="font-size:16px;">常见的网站攻击及预防2</span></span> </p> <p> <span style="font-size:16px;">会话劫持、回话固定等攻击预防,</span> </p> <span style="font-size:16px;">机器人登录预防,</span><br /><span style="font-size:16px;">登录出错次数限制</span><br /><br /><span style="font-size:16px;">4.简简单单完成CAS单点登录:</span><br /><span style="font-size:16px;">CAS单点登录的工作原理</span><br /><span style="font-size:16px;">搭建CAS中央服务器</span><br /><span style="font-size:16px;">CAS服务端配置</span><br /><span style="font-size:16px;">搭建CAS客户端服务器</span><br /><span style="font-size:16px;">CAS客户端配置</span><br /><span style="font-size:16px;">CAS客户端及服务端交互原理</span><br /><span style="font-size:16px;">部署及验证。</span><br /><br /><span style="font-size:16px;">5.登录及特殊访问控制</span><br /><span style="font-size:16px;">获取当前用户信息</span><br /><span style="font-size:16px;">标签库的使用</span><br /><span style="font-size:16px;">带权限、匿名、自动、单一登录控制</span><br /><br /><span style="font-size:16px;">6.URL访问控制和各种认证:</span><br /><span style="font-size:16px;">URL安全访问</span><br /><span style="font-size:16px;">URL匹配规则</span><br /><span style="font-size:16px;">表单认证</span><br /><span style="font-size:16px;">Basic认证</span><br /><span style="font-size:16px;">Digest认证</span><br /><span style="font-size:16px;">X509认证</span><br /><span style="font-size:16px;">预先认证</span><br /><br /><span style="font-size:16px;">7.授权策略和方法访问保护:</span><br /><span style="font-size:16px;">授权策略</span><br /><span style="font-size:16px;">投票机制</span><br /><span style="font-size:16px;">Spring-EL</span><br /><span style="font-size:16px;">特定请求授权</span><br /><span style="font-size:16px;">方法保护</span><br /><span style="font-size:16px;">拦截器</span><br /><br /><span style="font-size:16px;">视频原创,多年经验总结,精选最具价值实用技法,短小精干。</span><br /><span style="font-size:16px;"></span>
相关推荐
<div style="color:#444444;"> 适用人群 <p style="color:#666666;"> 所有的IT从业者,尤其适合快速掌握新技术,快速增长工作经验人群,对教育公平,教育公益,教育爱心公益人士 </p> </div> <p> </p> 课程概述 <p> 该互联网实战项目是基于 Spring Boot 2+ SpringSecurity5+Element UI+Vue Admin Template+蚂蚁可视化AntV 等技术栈开发的项目,采用分布式,多模块,前后端分离开发。包括图形展示、权限管理、用户管理等功能。<br /> 【后端技术】<br /> 技术 说明<br /> Spring Boot2 MVC框架 开发的一站式解决方案<br /> Spring Security认证和授权框架<br /> MyBatisPlus3.3.1  基于 MyBatis 框架的快速研发框架<br /> MyBatisCode工具 生成 MyBatis 相关代码<br /> Jackson 提供了处理 JSON 数据的工具<br /> Lombok 简化对象封装工具 <br /> Druid   数据库连接池 <br /> 【前端技术】<br /> Vue        互联网最火的前端框架<br /> Vue Router 路由框架<br /> Vuex 全局状态管理框架<br /> Axios 前端 HTTP 框架<br /> Element UI 前端 UI 框架<br /> Vue Element Admin 前端模板<br /> Antv  蚂蚁金服可视化技术,阿里巴巴可视化技术,天猫,淘宝,支付宝,花呗均使用AntV<br /> 【开发工具】<br /> IntelliJ IDEA 开发 IDE<br /> SQLyog 数据库连接客户端<br /> Postman HTTP 请求工具<br /> 【开发环境】<br /> 工具 版本<br /> JDK 1.8 </p> <p> MySQL 5.7 </p> <p> <img src="https://img-bss.csdn.net/202004100922276928.png" alt="" /><img src="https://img-bss.csdn.net/202004100922434479.png" alt="" /><img src="https://img-bss.csdn.net/202004100922566924.png" alt="" /><img src="https://img-bss.csdn.net/202004100923062693.png" alt="" /></p> <p> <br /></p> <p> <br /></p>
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页