spring-security-oauth2 源码分析A路线(一)

前言

在开始之前务必下载好源码 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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值