spring-oauth2
2019-05-09 09:43:05 184 举报
spring-oauth2的简单梳理 没有或多的介绍,都是源码的流程
作者其他创作
大纲/内容
获取配置的角色集合检查当前方法所需要的角色是否在其中
AbstractTokenGranter
PrePostAnnotationSecurityMetadataSource#getAttributes获取@PreAuthorize注解的方法,并为该方法添加对应的Expression
AbstractTokenGranter#grant
ResourceServerSecurityConfigurer
springsecurity+oauth2的11个拦截器的最后一个FilterSecurityInterceptor
实现
ProviderManager#authenticate
顶级身份管理者AuthenticationManager,实现类ProviderManager,改实现类内部维护了List<AuthenticationProvider>真正身份认证的接口,DaoAuthenticationProvider是常用的实现,它内部又聚合了一个UserDetailsService接口,UserDetailsService才是获取用户详细信息的最终接口authenticate方法就会触动验证,查询用户信息并验证,最终查到的就是用户自定义的UserDetailsService实现类
从请求中取出身份信息,即access_tokentokenExtractor.extract(request)BearerTokenExtractor实现认证身份AuthenticationManager.authenticate(token)将身份信息绑定到SecurityContextHolder中SecurityContextHolder.getContext().setAuthentication(authResult)
资源验证过滤器
TokenGranter
getAuthenticationManager().authenticate(authRequest)
configure(ResourceServerSecurityConfigurer resources)资源安全配置相关configure(HttpSecurity http) http安全配置相关
setTokenStore(TokenStore)
DefaultTokenServices#createAccessToke
如果当前存在,判断是否失效,没失效直接返回。失效了则移除当前和刷新的数据。创建token并存储。
ResourceServerConfigurerAdapter
spring security
passwordEncoder
参考 https://blog.csdn.net/bluuusea/article/details/80284458
this.getAuthenticationManager().authenticate
调用AbstractUserDetailsAuthenticationProvider的authenticate方法,通过username和Authentication对象来检索用户是否存在
认证过程总结@EnableAuthorizationServer
是否存在retrieveUser
@EnableResourceServer
AffirmativeBased#decide
OAuth2ExceptionRenderer#handleHttpEntityResponse
返回
抽象实现
AbstractMethodSecurityMetadataSource#getAttributes
获取Expression
setTokenServices(ResourceServerTokenServices)
request.getParameter(\"client_id\")request.getParameter(\"client_secret\")
AbstractUserDetailsAuthenticationProvider#authenticate
自定义处理
BasicAuthenticationFilter过滤器
OAuth2AuthenticationManager
configure
ClientCredentialsTokenGranter客户端模式
DaoAuthenticationProvider#retrieveUser
FilterSecurityInterceptor
加载客户端信息 ClientDetails authenticatedClient结合请求信息,创建TokenRequest tokenRequest将TokenRequest传递给TokenGranter颁发token OAuth2AccessToken token(DefaultOAuth2AccessToken实现类)
loadUserByUsername
自定义的管理去获取和验证token
自定义如->RedisTokenStore
AbstractAuthenticationToken()存在了内部的Collection<GrantedAuthority> authorities
用户实现的UserDetailsService子类
TokenEndpointToken处理端点上方的时序图
子类
循环验证其中的角色是
认证的过滤器(上面标蓝的)
OAuth2AuthenticationEntryPoint#commence
ProviderManager
身份认证管理
3.获取token
CompositeTokenGranter
角色值的传播
2验证
资源验证过程总结
PreInvocationAuthorizationAdviceVoter#vote
AuthenticationManager
ClientCredentialsTokenEndpointFilter
authenticate
new DefaultTokenServices()
链式的调用。其中的一个身份验证
getAccessToken
TokenEndpoint#postAccessToken
CompositeTokenGranter管理一个List列表,每一种grantType对应一个具体的真正授权者,内部就是在循环调用五种TokenGranter实现类的grant方法,找到配置的方式。
验证请求的Authorization
additionalAuthenticationChecksclient 和 secret
new PreAuthenticatedAuthenticationToken()
RefreshTokenGranter#getAccessToken
/oauth/token
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#doFilter从这开始----入口
资源认证管理
获取角色
configure(AuthorizationServerSecurityConfigurer security)配置AuthorizationServer安全认证的相关信息,创建ClientCredentialsTokenEndpointFilter核心过滤器configure(ClientDetailsServiceConfigurer clients) 配置OAuth2的客户端相关信息configure(AuthorizationServerEndpointsConfigurer endpoints)配置身份认证器,配置认证方式,TokenStore,TokenGranter,OAuth2RequestFactory等
ClientCredentialsTokenEndpointFilter#attemptAuthentication
获取OAuth2Authentication
RefreshTokenGranter刷新token专用
AuthorizationCodeTokenGranter授权码模式
获取用户信息
过滤器
4.创建token
ResourceOwnerPasswordTokenGranter#getOAuth2Authentication
异常时
调用干活的tokenServicescreateAccessTokenrefreshAccessTokengetAccessToken
super
user在实现认证时的定义子类中配置
authenticationManager.authenticate(authentication)
2
ImplicitTokenGranter简化模式
BearerTokenExtractor#extract
attemptAuthentication
执行表达式中的方法。即hasRole
ExpressionBasedPreInvocationAdvice#before
验证通过
认证核心过滤器
ResourceOwnerPasswordTokenGranter密码模式
1获取安全配置
doFilter
Spring启动时:org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerEndpointsConfiguration#authorizationEndpoint
AuthorizationServerTokenServices
tokenStore.getAccessToken:获取当前token
DaoAuthenticationProvider#additionalAuthenticationChecks
OAuth2AuthenticationProcessingFilter
刷新
PreAuthenticatedAuthenticationProvider#authenticate
在用自定义自己的UserDetailsService时,会初始化用户的角色存在User的Set<GrantedAuthority> authorities
1.请求认证服务器,获取token
AbstractOAuth2SecurityExceptionHandler#doHandle
角色的管理
默认实现
借助tokenServices根据token加载身份信息OAuth2Authentication auth = tokenServices.loadAuthentication(token);ResourceServerTokenServices 区别身份认证端的tokenServices.有俩个方法OAuth2Authentication loadAuthentication根据accessToken加载客户端信息OAuth2AccessToken readAccessToken根据accessToken获取完整的访问令牌详细信息
验证用户密码
authenticationManager(AuthenticationManager)
0 条评论
下一页