security oauth源码分析
2022-01-12 17:38:17 12 举报
AI智能生成
security oauth源码分析
作者其他创作
大纲/内容
认证服务器(@EnableAuthorizationServer)
1. @EnableAuthorizationServer注解引入AuthorizationServerEndpointsConfiguration和AuthorizationServerSecurityConfiguration类
2. AuthorizationServerEndpointsConfiguration 类初始化
2.1 实例化一个AuthorizationServerEndpointsConfigurer属性 endpoints
2.2 通过@Autowired注入自定义的 AuthorizationServerConfigurer配置列表(继承AuthorizationServerConfigurerAdapter),主要包含三个可重载的方法
1. configure(AuthorizationServerEndpointsConfigurer endpoints)(在2.3.1会被调用)
2. configure(ClientDetailsServiceConfigurer clients)(在3.2中会被调用)
3. configure(AuthorizationServerSecurityConfigurer security)(在3.3.2中会被调用)
重载该方法可以对AuthorizationServerEndpointsConfigurer 配置属性进行修改,如调用allowFormAuthenticationForClients方法
2.3 执行init方法
2.3.1 循环2.2 中的配置执行2.2#1中的configure(AuthorizationServerEndpointsConfigurer endpoints)方法设置自定义值
2.3.2 为AuthorizationServerEndpointsConfigurer 设置clientDetailsService
2.4 实例化AuthorizationEndpoint bean
2.4.1该bean中是第一次getEndpointsConfigurer()会设置tokenServices为DefaultTokenServices
1. 为tokenServices设置tokenStore
1. 如果有手动设置tokenStore则为设定的值
2. 如果未设置且accessTokenConverter值为JwtAccessTokenConverter则设置tokenStore为JwtTokenStore
3. 如果1和2都不符合则使用InMemoryTokenStore
2. 为tokenServices设置tokenEnhancer ,对token进行增强
1. 如果tokenEnhancer有设置直接使用设定的值,这个时候为accessTokenConverter设值是无效的
2. 如果tokenEnhancer未设置且accessTokenConverter为JwtAccessTokenConverter则将accessTokenConverter转为TokenEnhancer
3. 为tokenServices设置authenticationManager,该AuthenticationManager主要是在调用refreshAccessToken刷新token时对用户身份再次校验用的
2.5 实例化TokenEndpoint bean
2.5.1 设置clientDetailsService
2.5.2 设置tokenGranter,默认为CompositeTokenGranter,该类中维护这一个TokenGranter类型的List用来存在多种授权模式,如令牌模式,密码模式等
1. 在/oauth/token请求通过一系列的过滤器后会进入DispatcherServlet#doDispatch方法,最终会进入TokenEndpoint#postAccessToken方法,执行完一系列校验后最终调用CompositeTokenGranter#grant进行生成OAuth2AccessToken
2. CompositeTokenGranter#grant会循环设置的授权模式,调用抽象类AbstractTokenGranter#grant方法判断是否符合当前请求的模式,是符合的则将请求参数构建成OAuth2Authentication对象然后调用TokenServices进行生成OAuth2AccessToken
2.5.3 返回TokenEndpoint对象
3. AuthorizationServerSecurityConfiguration 类初始化
3.1 像2.2中那样注入AuthorizationServerConfigurer配置列表
3.2 和2.3的一样执行init方法,只是是调用 configure(ClientDetailsServiceConfigurer clients)
3.3 执行configure(HttpSecurity http)方法
1. 实例化AuthorizationServerSecurityConfigurer对象
2. 执行configure(AuthorizationServerSecurityConfigurer security)方法
3. 将AuthorizationServerSecurityConfigurer配置通过http.apply(configurer)添加到http配置列表中,在构建http对象的时候会执行,init和configure方法
4. 为http 设值,如设置/oauth/token请求都需要使用clientDetailsService进行认证才能访问
4. AuthorizationServerSecurityConfigurer 配置初始化
1. 执行init方法(在构建WebSecurity执行performBuild时会循环构建HttpSecurity,会调用到该方法)
1. 通过AuthenticationManagerBuilder#apply添加DaoAuthenticationConfigurer配置(在HttpSecurity构建时beforeConfigure方法中会调用该配置)
2. 往HttpSecurity中添加HttpBasicConfigurer,该配置会添加到configurersAddedInInitializing属性中,在configurers循环完后会循环执行configurersAddedInInitializing中的配置
2. 执行configure方法
1. 往HttpSecurity中添加clientCredentialsTokenEndpointFilter过滤器,注意要在3.3.2中调用allowFormAuthenticationForClients方法,不然不会添加该过滤器
2. 添加异常处理对象
资源服务器(@EnableResourceServer)
1. @EnableResourceServer 注解引入 ResourceServerConfiguration 配置类
2. ResourceServerConfiguration 配置类初始化
2.1 通过@Autowired注入自定义的 ResourceServerConfigurer配置列表(继承ResourceServerConfigurerAdapter),主要包含两个个可重载的方法
configure(ResourceServerSecurityConfigurer resources) //在2.2.3调用
configure(HttpSecurity http) //在2.2.4调用
2.2 执行configure(HttpSecurity http)方法(继承自WebSecurityConfigurerAdapter)
2.2.1 实例化ResourceServerSecurityConfigurer配置对象resources
2.2.2 为resources设置tokenStore用于在拦截请求后对token的合法性校验
1. 如果存在tokenServices 的spring bean则使用该bean中的tokenStore
2. 如果存在tokenStore 的spring bean 则使用该bean
3. 如果存在AuthorizationServerEndpointsConfiguration配置bean则从配置中取出tokenStore进行使用(在资源服务器和认证服务器在一个项目的时候会出现这种情况)
2.2.3 调用configure(ResourceServerSecurityConfigurer resources)
2.2.4 调用configure(HttpSecurity http)
3. ResourceServerSecurityConfigurer 配置初始化
3.1 执行init方法
3.2 执行configure方法
3.2.1 实例化一个OAuth2AuthenticationManager对象oauthAuthenticationManager
1. 如果有在2.2.3中设置OAuth2AuthenticationManager值则使用设置的值,没有的话实例化一个oauthAuthenticationManager对象
2. 为oauthAuthenticationManager设置TokenServices,如果没有值则设置为DefaultTokenServices,并为使用2.2.2中的tokenStore为DefaultTokenServices赋值
3. 设置ClientDetailsService
3.2.2 实例化一个OAuth2AuthenticationProcessingFilter过滤器resourcesServerFilter
3.2.3 为resourcesServerFilter设置异常处理
3.2.4 为resourcesServerFilter设置AuthenticationManager为3.2.1中创建的对象,主要用于对在OAuth2AuthenticationProcessingFilter过滤器拦截请求后对token进行合法性校验
3.2.5 将OAuth2AuthenticationProcessingFilter过滤器添加到过滤器链中
0 条评论
下一页