Spring Security Outh2的过滤器链如下图所示:
其中 SecurityContextPersistenceFilter用的是 NullSecurityContextRepository。 也就是说SecurityContextPersistenceFilter没有持久化SecurityContext, 这一步始终都是获取一个空的SecurityContext存放在SpringSecurityContextHolder中。
那么真正解析请求头部或者查询参数 Authorization 令牌的是什么呢? 是由 Oauth2AuthenticationProcassingFilter 进行解析的。
Oauth2AuthenticationProcassingFilter解析
TokenExtractor Token抽取器(比如:BearerTokenExtractor ), 用于解析参数获取Token信息, 返回PreAuthenticatedAuthenticationToken;
此时返回的 PreAuthenticatedAuthenticationToken 对象如下图所示
调用AuthenticationDetailsSource构建 details, 代码如下
public class OAuth2AuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, OAuth2AuthenticationDetails> { public OAuth2AuthenticationDetails buildDetails(HttpServletRequest context) { return new OAuth2AuthenticationDetails(context); } }
这一步执行完后 authentication状态如下:
认证授权,
调用 OAuth2AuthenticationManager对之前的authentication进行认证。
Authentication authResult = authenticationManager.authenticate(authentication);
对认证的逻辑展开下说明:
调用ResourceServerTokenServices (例如, DefaultTokenServices )中的loadAuthentication方法认证。其中有个重要的TokenStore, 我这里用的是JdbcTokenStore, 用于存取Token信息。还有ClientDetailsService接口, 用于判断clientId是否满足。
除了DefaultTokenServices外, 默认实现还有如下:
public OAuth2Authentication loadAuthentication(String accessTokenValue) throws AuthenticationException, InvalidTokenException { OAuth2AccessToken accessToken = tokenStore.readAccessToken(accessTokenValue); if (accessToken == null) { throw new InvalidTokenException("Invalid access token: " + accessTokenValue); } else if (accessToken.isExpired()) { tokenStore.removeAccessToken(accessToken); throw new InvalidTokenException("Access token expired: " + accessTokenValue); } OAuth2Authentication result = tokenStore.readAuthentication(accessToken); if (result == null) { // in case of race condition throw new InvalidTokenException("Invalid access token: " + accessTokenValue); } if (clientDetailsService != null) { String clientId = result.getOAuth2Request().getClientId(); try { clientDetailsService.loadClientByClientId(clientId); } catch (ClientRegistrationException e) { throw new InvalidTokenException("Client not valid: " + clientId, e); } } return result; }
认证成功后,调用Spring Security核心类 SecurityContextHolder 初始化Context上下文信息。
SecurityContextHolder.getContext().setAuthentication(authResult);
相关推荐
Spring Security OAuth2 是一个强大的框架,用于为Java应用提供OAuth2和OpenID Connect安全功能。OAuth2是一个授权框架,允许第三方应用在用户许可的情况下访问其受保护的资源,而OpenID Connect则是在OAuth2之上...
OAuth 2.0 是一种广泛使用的开放网络授权协议,它允许第三方应用安全地访问用户存储在其他服务上的数据,而无需获取用户的登录凭据。这个压缩包文件包含的是 OAuth 2.0 的服务端和客户端的源代码,这对于理解OAuth ...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、会话管理和加密等功能,而OAuth2则是一种开放标准,用于授权第三方应用访问用户资源。将Shiro与OAuth2集成,可以实现更灵活的安全控制,特别是在...
赠送jar包:spring-security-oauth2-2.3.5.RELEASE.jar; 赠送原API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc.jar; 赠送源代码:spring-security-oauth2-2.3.5.RELEASE-sources.jar; 赠送Maven依赖信息...
yii2-oauth2-server, 用于实现OAuth2服务器的包装器( https yii2-oauth2-server用于实现OAuth2服务器的包装器( https://github.com/bshaffer/oauth2-server-php 插件)安装安装这里扩展的首选方法是通过 Composer 。...
SpringBoot整合OAuth2和Gateway实现网关登录授权验证是一个复杂而关键的过程,它涉及到现代微服务架构中的安全性设计。OAuth2是一种授权框架,用于保护API并允许第三方应用访问受保护的资源,而Spring Gateway作为...
springboot和apache的开源项目org.apache.oltu.oauth2组合搭建的oauth2环境,一般的oauth配置下就可以用了,但是我这个项目,是用原理上讲如何搭建oauth2,哪个controller转发到哪个controller,为什么这样,都有...
《Spring Boot、Spring Security与OAuth2的完整示例解析》 在现代Web开发中,安全性是不可忽视的重要一环。Spring Boot、Spring Security和OAuth2是Java生态系统中用于构建安全Web应用的三大利器。本篇文章将围绕...
OAuth2 是一个授权框架,广泛应用于现代Web应用中,用于安全地实现第三方应用访问用户资源。单点登录(Single Sign-On, SSO)则是一种让用户在多个应用系统中只需要登录一次就能访问所有系统的机制。当你提到“模拟...
在Spring Cloud中,使用`ResourceServerConfigurerAdapter`进行配置,通常需要配置访问令牌的解析方式,如JWT(JSON Web Tokens)或者OAuth2的Resource Server端点。 单点登录(SSO)允许用户在一个系统登录后,...
OAuth2 是一种授权框架,广泛应用于现代Web应用和API的安全性。它允许第三方应用在用户许可的情况下访问受保护的资源,而无需获取用户的敏感登录凭证。在这个`oauth2.zip`压缩包中,包含两个Spring Boot工程,分别...
在这个"纯Java实现的OAuth2流程"中,我们将深入探讨如何不依赖Spring Boot来独立构建OAuth2的客户端和服务端。 首先,我们要理解OAuth2的基本流程,它通常包括四个角色:资源所有者(Resource Owner)、资源服务器...
#OAuth2-Defender ##主要技术 Maven Spring Boot Spring Security Spring Security OAuth2.0 MySQL ##修改数据库配置 修改defender-oauth2-authorization\src\main\resources\...
使用OAuth2时,通常还会涉及到 JWT(JSON Web Tokens),这是一种简洁的、自包含的方式用于通信双方之间以JSON对象的形式安全地传输信息。这些令牌可以包含声明(claims),例如用户信息和令牌过期时间等。在OAuth2...
Spring Cloud OAuth2是一种基于OAuth2协议的授权框架,它为微服务架构提供了安全的认证和授权服务。在“Spring Cloud Oauth2的密码模式数据库方式实现登录授权验证”这个主题中,我们将深入探讨如何利用OAuth2的密码...
OAuth2是一种广泛应用于互联网服务的授权协议,它允许第三方应用在用户许可的情况下,安全地访问用户的私有资源,而无需获取用户的登录凭证。OAuth2在Java中的实现通常涉及到服务端和客户端两个部分,这两个部分在...
Spring Security OAuth2是Spring生态系统中的一个模块,专门用于实现OAuth2规范,为开发者提供了构建安全、可扩展的API服务的能力。 1. **密码模式登录**: 密码模式是OAuth2中的一个授权类型,适用于用户直接登录...
Spring Cloud OAuth2结合Zuul,为微服务架构提供了一种安全、高效的身份验证和授权解决方案。以下是对这些技术的详细解释: **OAuth2** 是一个开放标准,主要用于授权。它不直接处理用户身份验证,但允许第三方应用...
在Spring OAuth2框架中,获取当前登录用户信息的过程与Spring Security有所不同。通常,Spring Security允许我们通过`SecurityContextHolder.getContext().getAuthentication().getPrincipal()`来获取详细的用户信息...
在Spring Cloud中,我们可以使用Spring Security OAuth2模块来实现OAuth2的授权服务器和资源服务器。 1. **OAuth2流程**: - 授权请求:客户端(如浏览器或移动应用)引导用户到授权服务器进行登录。 - 用户授权...