Java最新Spring Security账号密码认证源码解析,关于电商秒杀系统中防超卖处理方案简述

最后

光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性

Java面试宝典2021版

最常见Java面试题解析(2021最新版)

2021企业Java面试题精选

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

// 判断当前过滤器能否处理该请求,如果不能,则交给下一个filter去处理

if (!requiresAuthentication(request, response)) {

chain.doFilter(request, response);

return;

}

try {

// 调用子类中的方法,创建Authentication实现类

Authentication authenticationResult = attemptAuthentication(request, response);

if (authenticationResult == null) {

// return immediately as subclass has indicated that it hasn’t completed

return;

}

// 如果成功则做些session相关操作,例如将信息保存到session

this.sessionStrategy.onAuthentication(authenticationResult, request, response);

// Authentication success

if (this.continueChainBeforeSuccessfulAuthentication) {

chain.doFilter(request, response);

}

successfulAuthentication(request, response, chain, authenticationResult);

}

catch (InternalAuthenticationServiceException failed) {

this.logger.error(“An internal error occurred while trying to authenticate the user.”, failed);

unsuccessfulAuthentication(request, response, failed);

}

catch (AuthenticationException ex) {

// Authentication failed

unsuccessfulAuthentication(request, response, ex);

}

}

2.doFilter方法中调用了自身的attemptAuthentication()方法


在这里插入图片描述

3.attemptAuthentication()方法中调用了AuthenticationManager接口实现类ProviderManager的authenticate方法。


(1)在attemptAuthentication()方法中,只是将账号密码和一些请求信息封装在了一个类中,但并没有对权限,密码是否正确等进行认证,该方法就是用来进行认证管理的。

(2)AuthenticationManager是一个接口,该接口中只有一个authenticate方法。

public interface AuthenticationManager {

Authentication authenticate(Authentication var1) throws AuthenticationException;

}

(3)该接口的主要实现类为ProviderManager,调用的就是该类的authenticate方法。该类有二个用于认证的成员变量:

private List providers;

private AuthenticationManager parent;

AuthenticationProvider是一个接口,是用来提供认证服务的,ProviderManager只是用来管理认证服务的。

// 该接口有两个方法,该接口的实现类主要做认证的。

public interface AuthenticationProvider {

Authentication authenticate(Authentication var1) throws AuthenticationException;

// supports是用来检测该类型的认证信息是否可以被自己处理。可以被处理则调用自身的authenticate方法。

boolean supports(Class<?> var1);

}

(4)ProviderManager的authenticate()方法源码关键部分如下:

public Authentication authenticate(Authentication authentication) throws AuthenticationException {

Class toTest = authentication.getClass();

Object lastException = null;

Authentication result = null;

boolean debug = logger.isDebugEnabled();

// 拿到全部的provider

Iterator e = this.getProviders().iterator();

// 遍历provider

while(e.hasNext()) {

AuthenticationProvider provider = (AuthenticationProvider)e.next();

// 挨着个的校验是否支持当前token

if(provider.supports(toTest)) {

if(debug) {

logger.debug("Authentication attempt using " + provider.getClass().getName());

}

try {

// 找到后直接break,并由当前provider来进行校验工作

result = provider.authenticate(authentication);

if(result != null) {

this.copyDetails(authentication, result);

break;

}

} catch (AccountStatusException var11) {

this.prepareException(var11, authentication);

throw var11;

} catch (InternalAuthenticationServiceException var12) {

this.prepareException(var12, authentication);

throw var12;

} catch (AuthenticationException var13) {

lastException = var13;

}

}

}

// 若没有一个支持,则尝试交给父类来执行

if(result == null && this.parent != null) {

try {

result = this.parent.authenticate(authentication);

} catch (ProviderNotFoundException var9) {

;

} catch (AuthenticationException var10) {

lastException = var10;

}

}

}

其中会遍历调用AuthenticationProvider实现类对象的supports方法,如果方法返回true,则调用AuthenticationProvider实现类对象的authenticate()方法,该方法是用来进行认证的。

如果该ProviderManager的List providers都无法处理,则会调用该ProviderManager的AuthenticationManager parent的authenticate方法,流程一样。

4.AuthenticationManager对象的authenticate方法中调用AuthenticationProvider接口实现类DaoAuthenticationProvider的authenticate方法


**(1) DaoAuthenticationProvider **

对于我们前面封装的UsernamePasswordAuthenticationToken 对象,它的认证处理可以被DaoAuthenticationProvider类进行认证。

DaoAuthenticationProvider类中其实没有定义authenticate方法,它是继承了父类AbstractUserDetailsAuthenticationProvider中的authenticate方法。

AbstractUserDetailsAuthenticationProvider的authenticate()方法源码如下:

// 实现了AuthenticationProvider接口

public abstract class AbstractUserDetailsAuthenticationProvider implements AuthenticationProvider, InitializingBean, MessageSourceAware {

public Authentication authenticate(Authentication authentication) throws AuthenticationException {

Assert.isInstanceOf(UsernamePasswordAuthenticationToken.class, authentication, this.messages.getMessage(“AbstractUserDetailsAuthenticationProvider.onlySupports”, “Only UsernamePasswordAuthenticationToken is supported”));

String username = authentication.getPrincipal() == null?“NONE_PROVIDED”:authentication.getName();

boolean cacheWasUsed = true;

UserDetails user = this.userCache.getUserFromCache(username);

if(user == null) {

cacheWasUsed = false;

try {

// 调用自类retrieveUser

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

} catch (UsernameNotFoundException var6) {

this.logger.debug(“User '” + username + “’ not found”);

最后

由于细节内容实在太多了,为了不影响文章的观赏性,只截出了一部分知识点大致的介绍一下,每个小节点里面都有更细化的内容!

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

1715412947095)]

小编准备了一份Java进阶学习路线图(Xmind)以及来年金三银四必备的一份《Java面试必备指南》

[外链图片转存中…(img-ESJco9q9-1715412947096)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 27
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 是一个功能强大且广泛使用的安全框架,用于保护 Java 应用程序的身份验证和授权。它提供了一套全面的安全解决方案,包括认证、授权、攻击防护等功能。 Spring Security源码是开源的,可以从官方仓库(https://github.com/spring-projects/spring-security)获取到。在源码中,主要包含以下几个关键模块: 1. 核心模块(Core):提供了基本的认证和授权功能,包括用户身份认证、访问控制等。核心模块的源码位于 `spring-security-core` 包下。 2. Web 模块(Web):提供了与 Web 应用程序集成的相关功能,如基于 URL 的授权、Web 表单登录、记住我功能等。Web 模块的源码位于 `spring-security-web` 包下。 3. 配置模块(Config):提供了基于 Java 配置和 XML 配置的方式来配置 Spring Security。配置模块的源码位于 `spring-security-config` 包下。 4. 测试模块(Test):提供了用于测试 Spring Security 的工具和辅助类。测试模块的源码位于 `spring-security-test` 包下。 在源码中,你可以深入了解 Spring Security 的内部工作原理、各个组件之间的协作关系以及具体的实现细节。可以通过跟踪调试源码,了解每个功能是如何实现的,从而更好地理解和使用 Spring Security。 请注意,Spring Security源码是非常庞大且复杂的,需要一定的时间和精力去深入研究。建议在阅读源码之前,先对 Spring Security 的基本概念和使用方法有一定的了解,这样会更有助于理解源码中的内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值