广告
返回顶部
首页 > 资讯 > 精选 >Spring Security认证机制是什么
  • 779
分享到

Spring Security认证机制是什么

2023-07-05 17:07:03 779人浏览 八月长安
摘要

这篇“spring Security认证机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&nb

这篇“spring Security认证机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring Security认证机制是什么”文章吧。

Spring Security提供如下几种认证机制

  • Username & PassWord

  • OAuth3.0 Login

  • SAML 2.0 Login

  • Remember Me

  • JAAS Authentication

  • Pre-authentication ScenariOS

  • X509 Authentication

这里使用Spring Boot 2.7.4版本,对应Spring Security 5.7.3版本

Servlet Authentication Architecture

首先明确两个概念:

  • Principle : This interface represents the abstract notion of a principal, which can be used to represent any entity, such as an individual, a corporation, and a login id. 简单来说 可以认为是 唯一确定用户的 一个 userId ,但这个Principle是一个接口,具体参考 java.security.Principal

  • Credential : 通常就是一个密码,但他不是接口,而是通过接口Authentication#getCredentials来获取,返回一个Object类型。

Spring Security提供了以下几个核心类:

  • SecurityContextHolder : Spring Security用来保存被认证用户的详细信息(默认使用ThreadLocal保存);

  • SecurityContext : 从 SecurityContextHolder 获取得到,该接口提供被认证用户的 Authentication信息;

  • Authentication : 代表"认证",其中包含Principle和Credential,通过AuthenticationManager#authenticate来认证一个Authentication,该方法接受一个未认证的Authentication并返回一个认证后的Authentication。

  • GrantedAuthority : 认证后的Principle包含的权限

  • AuthenticationManager : 实施认证行为的接口,该类为函数式接口,只有一个方法: Authentication authenticate(Authentication authentication) throws AuthenticationException;

  • ProviderManager : the most common implementation of AuthenticationManager.

  • AuthenticationProvider : 提供认证方式的接口,组合在ProviderManager中。

Spring Security认证机制是什么

SecurityContextHolder

先来看一个使用SecurityContextHolder和SecurityContext完成认证的案例:

SecurityContext context = SecurityContextHolder.createEmptyContext();// 手动生成一个Authentication,实际一般是通过数据库查出来生成的Authentication authentication =    new TestingAuthenticationToken("username", "password", "ROLE_USER");context.setAuthentication(authentication);SecurityContextHolder.setContext(context);

默认 情况下 SecurityContext存储使用ThreadLocal方式,这个就是ThreadLocal的一个用处,避免函数间参数传递的复杂性,只要处于一个线程,就可以直接获取而不需要通过函数参数返回值来传递。

注意:在使用ThreadLocal时,由于键是其this本身,是一个弱引用,而值只能是强引用,所以ThreadLocal不用时需要手动clear。而Spring Security中,在 FilterChainProxy中完成这一清除工作,如下:

public class FilterChainProxy extends GenericFilterBean {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {...try {...// 执行Spring Security 的 SecurityFilterChaindoFilterInternal(request, response, chain);}catch (Exception ex) {...}finally {// ***************// 清除ThreadLocal// ***************SecurityContextHolder.clearContext();request.removeAttribute(FILTER_APPLIED);}}}

但有些情形是用不了ThreadLocal的,For example, a Swing client might want all threads in a Java Virtual Machine to use the same security context 。针对其他情况,SecurityContextHolder提供了4种模式,当然也可以自定义:

  • MODE_THREADLOCAL

  • MODE_GLOBAL

  • MODE_INHERITABLETHREADLOCAL

  • MODE_PRE_INITIALIZED

可以通过2种方式去修改模式:

  • set a system property

  • a static method on SecurityContextHolder

public class SecurityContextHolder {// 存储SecurityContext的模式,默认 ThreadLocal存储public static final String MODE_THREADLOCAL = "MODE_THREADLOCAL";public static final String MODE_INHERITABLETHREADLOCAL = "MODE_INHERITABLETHREADLOCAL";public static final String MODE_GLOBAL = "MODE_GLOBAL";private static final String MODE_PRE_INITIALIZED = "MODE_PRE_INITIALIZED";public static final String SYSTEM_PROPERTY = "spring.security.strategy";// 通过系统参数指定 存储模式private static String strategyName = System.getProperty(SYSTEM_PROPERTY);// 实际存储SecurityContext的接口(类)private static SecurityContextHolderStrategy strategy;private static int initializeCount = 0;static {// 初始化initialize();}private static void initialize() {initializeStrategy();initializeCount++;}private static void initializeStrategy() {...if (!StringUtils.hasText(strategyName)) {// Set default 默认 ThreadLocalstrategyName = MODE_THREADLOCAL;}if (strategyName.equals(MODE_THREADLOCAL)) {strategy = new ThreadLocalSecurityContextHolderStrategy();return;}...}// 修改Strategypublic static void setStrategyName(String strategyName) {SecurityContextHolder.strategyName = strategyName;initialize();}// 自定义Strategypublic static void setContextHolderStrategy(SecurityContextHolderStrategy strategy) {Assert.notNull(strategy, "securityContextHolderStrategy cannot be null");SecurityContextHolder.strategyName = MODE_PRE_INITIALIZED;SecurityContextHolder.strategy = strategy;initialize();}public static SecurityContext getContext() {return strategy.getContext();}public static void setContext(SecurityContext context) {strategy.setContext(context);}public static void clearContext() {strategy.clearContext();}

可以看到,SecurityContextHolder实际上是一个门面,具体的Context存储在SecurityContextHolderStrategy中,来看看该接口默认的实现 ThreadLocalSecurityContextHolderStrategy :

final class ThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy {// ThreadLocalprivate static final ThreadLocal<SecurityContext> contextHolder = new ThreadLocal<>();@Overridepublic void clearContext() {contextHolder.remove();}@Overridepublic SecurityContext getContext() {SecurityContext ctx = contextHolder.get();if (ctx == null) {ctx = createEmptyContext();contextHolder.set(ctx);}return ctx;}@Overridepublic void setContext(SecurityContext context) {Assert.notNull(context, "Only non-null SecurityContext instances are permitted");contextHolder.set(context);}@Overridepublic SecurityContext createEmptyContext() {return new SecurityContextImpl();}}

AuthenticationManager

public interface AuthenticationManager {// 传入一个待认证的Authentication// 返回 a fully authenticated object including credentialsAuthentication authenticate(Authentication authentication) throws AuthenticationException;}

AuthenticationManager的最常用实现类 ProviderManager,ProviderManager调用多个AuthenticationProvider来认证传入的Authentication,只要有一个认证成功即可返回(返回nonNull),否则会抛出异常,AuthenticationManager默认支持三种异常:

  • DisabledException : 用户账号被disabled

  • LockedException : 用户账号被locked

  • BadCredentialsException : credentials错误(密码错误)

public class ProviderManager implements AuthenticationManager, MessageSourceAware, InitializingBean {// 事件发布,默认空实现private AuthenticationEventPublisher eventPublisher = new NullEventPublisher();// 实际认证的AuthenticationProviderprivate List<AuthenticationProvider> providers = Collections.emptyList();// 父级认证Managerprivate AuthenticationManager parent;@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {for (AuthenticationProvider provider : getProviders()) {if (!provider.supports(toTest)) {continue;}...result = provider.authenticate(authentication);if (result != null) {copyDetails(authentication, result);break;}...}// 该类中AuthenticationManager都判断完了,结果还是空,调用parent开始认证if (result == null && this.parent != null) {// Allow the parent to try.parentResult = this.parent.authenticate(authentication);}...// AbstractAuthenticationToken就是Authentication接口的实现类,模板模式// 常用的UsernamePasswordAuthenticationToken和OAuth3AuthenticationToken都extends这个Abstract类private void copyDetails(Authentication source, Authentication dest) {if ((dest instanceof AbstractAuthenticationToken) && (dest.getDetails() == null)) {AbstractAuthenticationToken token = (AbstractAuthenticationToken) dest;token.setDetails(source.getDetails());}}}

可以看到 ProviderManager implements AuthenticationManager将认证工作进一步分配给 AuthenticationProvider,而这个AuthenticationProvider会根据支持的认证方式来认证,所以这个接口除了认证方法还有一个是否支持认证的判断方法:

public interface AuthenticationProvider {Authentication authenticate(Authentication authentication) throws AuthenticationException;boolean supports(Class<?> authentication);

AuthenticationProvider常见的实现类有:

  • DaoAuthenticationProvider : An AuthenticationProvider implementation that retrieves user details from a UserDetailsService. 用于UsernamePassword认证方式

  • OAuth3AuthorizationCodeAuthenticationProvider : 在授权服务器上认证authorization_code,拿着code换accessToken

  • OAuth3LoginAuthenticationProvider : 在授权服务器上认证authorization_code,拿着code换accessToken(这一步委托给上面的 OAuth3AuthorizationCodeAuthenticationProvider执行了),此外,还会拿着accessToken换取UserInfo,属于上面的加强版,OAuth3.0 Login一般都是调用这个Provider。

  • OidcAuthorizationCodeAuthenticationProvider : 同上,不过在OAuth3.0基础上加了OpenID Connect协议。

以上就是关于“Spring Security认证机制是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Spring Security认证机制是什么

本文链接: https://www.lsjlt.com/news/353763.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Spring Security认证机制是什么
    这篇“Spring Security认证机制是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&nb...
    99+
    2023-07-05
  • Spring Security认证的方法是什么
    今天小编给大家分享一下Spring Security认证的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。...
    99+
    2023-06-28
  • Security登录认证的流程是什么
    这篇文章主要介绍“Security登录认证的流程是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Security登录认证的流程是什么”文章能帮助大家解决问题。一、前言:流程图:二、前台发送请求用...
    99+
    2023-06-26
  • 通过Spring Security魔幻山谷讲解获取认证机制核心原理
    本文基于Springboot+Vue+Spring Security框架而写的原创学习笔记,demo代码参考《Spring Boot+Spring Cloud+Vue+Element...
    99+
    2022-11-12
  • Linux系统PAM认证机制是什么
    本篇文章给大家分享的是有关Linux系统PAM认证机制是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。PAM是由sun提出的认证机制,通过一些动态链接库和一套统一的API可...
    99+
    2023-06-28
  • Java Spring Security认证与授权及注销和权限控制篇综合解析
    Spring Security简介: Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,它可以实现强大的Web安...
    99+
    2022-11-12
  • Spring Security的登陆流程是什么
    本篇内容介绍了“Spring Security的登陆流程是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Spring Security...
    99+
    2023-06-25
  • Springboot+Spring Security实现前后端分离登录认证及权限控制的示例代码
    目录前言本文主要的功能 一、准备工作1、统一错误码枚举2、统一json返回体3、返回体构造工具4、pom5、配置文件二、数据库表设计初始化表数据语句三、Spring Sec...
    99+
    2022-11-12
  • Spring Security核心过滤器链是什么
    本篇内容主要讲解“Spring Security核心过滤器链是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Security核心过滤器链是什么”吧!一、Fi...
    99+
    2023-06-21
  • 什么是CA认证
    CA认证是指数字证书认证中心(Certification Authority)的认证。数字证书认证中心是为网络通信提供安全性和信任的...
    99+
    2023-09-20
    CA认证
  • token认证是什么
    这篇文章主要介绍了token认证是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇token认证是什么文章都会有所收获,下面我们一起来看看吧。以前的开发模式是以MVC为主,但是随着互联网行业快速的发展逐渐的演...
    99+
    2023-06-27
  • Spring Security中的四种权限控制方式分别是什么
    本篇文章为大家展示了Spring Security中的四种权限控制方式分别是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Spring Security 中对于...
    99+
    2022-10-19
  • rabbitmq消息确认机制是什么
    RabbitMQ消息确认机制是一种用于保证消息可靠传输的机制。它确保生产者发送的消息被正确地传递给消费者并被消费者成功处理。在Rab...
    99+
    2023-10-09
    rabbitmq
  • Spring Security中WebSecurity和HttpSecurity的关系是什么
    这篇文章给大家分享的是有关Spring Security中WebSecurity和HttpSecurity的关系是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前几天有粉丝私...
    99+
    2022-10-19
  • Spring Security 安全框架的原理是什么
    本篇文章给大家分享的是有关Spring Security 安全框架的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。认证授权分析用户在进行资源访问时,要求系统要对用户进...
    99+
    2023-06-20
  • redis的默认存储机制是什么
    Redis的默认存储机制是将数据存储在内存中。当Redis启动时,它会将数据加载到内存中,并在内存中进行数据的读写操作。这种存储机制...
    99+
    2023-08-30
    redis
  • MongoDB管理用户的认证机制是怎样的
    MongoDB管理用户的认证机制是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、MongoDB用户认证机制简介为了认证客户端,你必须...
    99+
    2022-10-18
  • Spring的依赖注入机制是什么
    Spring的依赖注入(Dependency Injection,DI)机制是一种设计模式,用于实现对象之间的解耦和组件的松耦合。它...
    99+
    2023-09-17
    Spring
  • Spring/SpringBoot 事件监听机制是什么
    本篇文章给大家分享的是有关Spring/SpringBoot 事件监听机制是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。事件监听机制可以理解为是一种观察者模式,有数据发布...
    99+
    2023-06-17
  • MongoDB3.0中怎么修改数据库认证机制
    这篇文章给大家介绍MongoDB3.0中怎么修改数据库认证机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 修改需求:MongoDB3.0当前认证机制为...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作