1. @EnableAuthorizationServer注解引入AuthorizationServerEndpointsConfiguration和AuthorizationServerSecurityConfiguration类<br>
2. AuthorizationServerEndpointsConfiguration 类初始化<br>
2.1 实例化一个AuthorizationServerEndpointsConfigurer属性 endpoints<br>
2.2 通过@Autowired注入自定义的 AuthorizationServerConfigurer配置列表(继承AuthorizationServerConfigurerAdapter),主要包含三个可重载的方法<br>
1. configure(AuthorizationServerEndpointsConfigurer endpoints)(在2.3.1会被调用)
2. configure(ClientDetailsServiceConfigurer clients)(在3.2中会被调用)<br>
3. configure(AuthorizationServerSecurityConfigurer security)(在3.3.2中会被调用)<br>
重载该方法可以对AuthorizationServerEndpointsConfigurer 配置属性进行修改,如调用allowFormAuthenticationForClients方法<br>
2.3 执行init方法<br>
2.3.1 循环2.2 中的配置执行2.2#1中的configure(AuthorizationServerEndpointsConfigurer endpoints)方法设置自定义值<br>
2.3.2 为AuthorizationServerEndpointsConfigurer 设置clientDetailsService<br>
2.4 实例化AuthorizationEndpoint bean<br>
2.4.1该bean中是第一次getEndpointsConfigurer()会设置tokenServices为DefaultTokenServices<br>
1. 为tokenServices设置tokenStore<br>
1. 如果有手动设置tokenStore则为设定的值<br>
2. 如果未设置且accessTokenConverter值为JwtAccessTokenConverter则设置tokenStore为JwtTokenStore
3. 如果1和2都不符合则使用InMemoryTokenStore<br>
2. 为tokenServices设置tokenEnhancer ,对token进行增强<br>
1. 如果tokenEnhancer有设置直接使用设定的值,这个时候为accessTokenConverter设值是无效的<br>
2. 如果tokenEnhancer未设置且accessTokenConverter为JwtAccessTokenConverter则将accessTokenConverter转为TokenEnhancer<br>
3. 为tokenServices设置authenticationManager,该AuthenticationManager主要是在调用refreshAccessToken刷新token时对用户身份再次校验用的<br>
2.5 实例化TokenEndpoint bean<br>
2.5.1 设置clientDetailsService
2.5.2 设置tokenGranter,默认为CompositeTokenGranter,该类中维护这一个TokenGranter类型的List用来存在多种授权模式,如令牌模式,密码模式等<br>
1. 在/oauth/token请求通过一系列的过滤器后会进入DispatcherServlet#doDispatch方法,最终会进入TokenEndpoint#postAccessToken方法,执行完一系列校验后最终调用CompositeTokenGranter#grant进行生成OAuth2AccessToken<br>
2. CompositeTokenGranter#grant会循环设置的授权模式,调用抽象类AbstractTokenGranter#grant方法判断是否符合当前请求的模式,是符合的则将请求参数构建成OAuth2Authentication对象然后调用TokenServices进行生成OAuth2AccessToken<br>
2.5.3 返回TokenEndpoint对象<br>
3. AuthorizationServerSecurityConfiguration 类初始化<br>
3.1 像2.2中那样注入AuthorizationServerConfigurer配置列表
3.2 和2.3的一样执行init方法,只是是调用 configure(ClientDetailsServiceConfigurer clients)<br>
3.3 执行configure(HttpSecurity http)方法<br>
1. 实例化AuthorizationServerSecurityConfigurer对象
2. 执行configure(AuthorizationServerSecurityConfigurer security)方法<br>
3. 将AuthorizationServerSecurityConfigurer配置通过http.apply(configurer)添加到http配置列表中,在构建http对象的时候会执行,init和configure方法
4. 为http 设值,如设置/oauth/token请求都需要使用clientDetailsService进行认证才能访问<br>
4. AuthorizationServerSecurityConfigurer 配置初始化<br>
1. 执行init方法(在构建WebSecurity执行performBuild时会循环构建HttpSecurity,会调用到该方法)<br>
1. 通过AuthenticationManagerBuilder#apply添加DaoAuthenticationConfigurer配置(在HttpSecurity构建时beforeConfigure方法中会调用该配置)<br>
2. 往HttpSecurity中添加HttpBasicConfigurer,该配置会添加到configurersAddedInInitializing属性中,在configurers循环完后会循环执行configurersAddedInInitializing中的配置<br>
2. 执行configure方法<br>
1. 往HttpSecurity中添加clientCredentialsTokenEndpointFilter过滤器,注意要在3.3.2中调用allowFormAuthenticationForClients方法,不然不会添加该过滤器<br>
2. 添加异常处理对象