文章目录
前言
在开始之前务必下载好源码 spring-security-oauth2-2.3.x版本https://codeload.github.com/spring-projects/spring-security-oauth/zip/2.3.x,
并基于 spring-security-oauth2 配置(二),将注解配置开始分析源码称为A路线 ,将授权模式访问分析源码称为B路线
A路线与B路线互相印证。
@EnableAuthorizationServer
最开始的注解当然是这两个注解@EnableAuthorizationServer、@EnableResourceServer,AuthorizationServer是授权服务,那么先从@EnableAuthorizationServer开始。发现类上使用@Import导入了两个配置类,那么先从AuthorizationServerSecurityConfiguration配置类开始
AuthorizationServerSecurityConfiguration
AuthorizationServerSecurityConfiguration:授权服务器安全配置类
AuthorizationServerSecurityConfiguration配置类上又使用了@Import导入了两个配置类,并且继承了spring-security包中的抽象类WebSecurityConfigurerAdapter,先分析configure(HttpSecurity http)方法。
AuthorizationServerSecurityConfigurer 对象的暴露
@Override
protected void configure(HttpSecurity http) throws Exception {
// 这个类之前出现在我们授权服务器配置类中,因为我们的案例的DemoAuthorizationServerConfiguration继承了AuthorizationServerConfigurerAdapter,
// 重写了它的方法configure(AuthorizationServerSecurityConfigurer security),
// AuthorizationServerSecurityConfigurer根据源码类的注释,它的作用是:配置授权服务器端点的安全
AuthorizationServerSecurityConfigurer configurer = new AuthorizationServerSecurityConfigurer();
// 接下来看到了FrameworkEndpointHandlerMapping,根据源码类注释,它的描述:框架端点处理器。其实我们可以将它做成一个Controller。
// 这个对象是由AuthorizationServerEndpointsConfiguration对象中获取的,AuthorizationServerEndpointsConfiguration之后再分析
FrameworkEndpointHandlerMapping handlerMapping = endpoints.oauth2EndpointHandlerMapping();
// 将FrameworkEndpointHandlerMapping保存到HttpSecurity对象中一个hashMap中,用于后面共享使用
http.setSharedObject(FrameworkEndpointHandlerMapping.class, handlerMapping);
// 将AuthorizationServerSecurityConfigurer对象暴露给外部使用
configure(configurer);
// 应用AuthorizationServerSecurityConfigurer配置,如果被外部修改了配置
http.apply(configurer);
// 根据参数名称,猜测获取了FrameworkEndpointHandlerMapping中配置的:token端点、token_key、token检查端点的访问路径,具体之后查看
String tokenEndpointPath = handlerMapping.getServletPath("/oauth/token");
String tokenKeyPath = handlerMapping.getServletPath("/oauth/token_key");
String checkTokenPath = handlerMapping.getServletPath("/oauth/check_token");
// 是否使用了自定义的UserDetailsService,如果不是自定义,将其设置到AuthorizationServerEndpointsConfigurer中
if (!endpoints.getEndpointsConfigurer().isUserDetailsServiceOverride()) {
UserDetailsService userDetailsService = http.getSharedObject(UserDetailsService.class);
endpoints.getEndpointsConfigurer().userDetailsService(userDetailsService);
}
// 将获取的token端点、token_key、token检查端点的访问路径分别配置访问权限,并将ClientDetailsService的实现类
// 保存到HttpSecurity对象中一个hashMap中,用于后面共享使用
// @formatter:off
http
.authorizeRequests()
.antMatchers(tokenEndpointPath).fullyAuthenticated()
.antMatchers(tokenKeyPath).access(configurer.getTokenKeyAccess())
.antMatchers(checkTokenPath).access(configurer.getCheckTokenAccess())
.and()
.requestMatchers()
.antMatchers(tokenEndpointPath, tokenKeyPath, checkTokenPath)
.and(