OAuth2.0学习(4-99)Spring Security OAuth2.0 开发指南
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OAuth2.0学习(4-99)Spring Security OAuth2.0 开发指南相关的知识,希望对你有一定的参考价值。
1、org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter
org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter
org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 登录验证(用户名密码验证)
1.1、org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter
1.2、org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter
1.3、org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter
1.4、UsernamePasswordAuthenticationFilter
父类AbstractAuthenticationProcessingFilter中有一个AuthenticationManager接口属性,验证工作主要是通过这个AuthenticationManager接口的实例来完成的。
在默认情况下,springSecurity框架会把org.springframework.security.authentication.ProviderManager类的实例注入到该属性。
UsernamePasswordAuthenticationFilter的验证过程如下:
1. 首先过滤器会调用自身的attemptAuthentication方法,从request中取出authentication, authentication是在org.springframework.security.web.context.SecurityContextPersistenceFilter过滤器中通过捕获用户提交的登录表单中的内容生成的一个org.springframework.security.core.Authentication接口实例.
2. 拿到authentication对象后,过滤器会调用ProviderManager类的authenticate方法,并传入该对象
3.ProviderManager类的authenticate方法再调用自身的doAuthentication方法,在doAuthentication方法中会调用类中的List<AuthenticationProvider> providers集合中的各个AuthenticationProvider接口实现类中的authenticate(Authentication authentication)方法进行验证,由此可见,真正的验证逻辑是由各个各个AuthenticationProvider接口实现类来完成的,DaoAuthenticationProvider类是默认情况下注入的一个AuthenticationProvider接口实现类
4.AuthenticationProvider接口通过UserDetailsService来获取用户信息
2、OAuth2AuthenticationManager
java.security.MessageDigest类用于为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。简单点说就是用于生成散列码。
信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
此处对access_token求摘要,这个摘要即存储表内的access_token的主键值,用这个主键值求oauth_access_token.token(序列化的OAuth2AccessToken值),再反序列化为OAuth2AccessToken对象传出。求得后立刻判断是否过期,如果过期,抛出异常 throw new InvalidTokenException("Access token expired: " + accessTokenValue);
如果没过期继续查询OAuth2Authentication对象。
OAuth2Authentication在oauth_access_token的同一条记录上。取出OAuth2Authentication返回前判断是否存在该clientId,不存在就跑出异常。
OAuth2AuthenticationManager.authenticate->
protected String extractTokenKey(String value) {
if (value == null) {
return null;
}
MessageDigest digest;
try {
digest = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("MD5 algorithm not available. Fatal (should be in the JDK).");
}
try {
byte[] bytes = digest.digest(value.getBytes("UTF-8"));
return String.format("%032x", new BigInteger(1, bytes));
}
catch (UnsupportedEncodingException e) {
throw new IllegalStateException("UTF-8 encoding not available. Fatal (should be in the JDK).");
}
}
以上是关于OAuth2.0学习(4-99)Spring Security OAuth2.0 开发指南的主要内容,如果未能解决你的问题,请参考以下文章
Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)
Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)
OAuth2.0学习(4-12)spring-oauth-server分析 - 授权码模式验证过程
OAuth2.0学习(4-11)spring-oauth-server分析 - http元素使用的是何种AuthenticationManager?