基于SpringSecurity OAuth2实现单点登录——应用A是如何重定向到授权服务器的授权地址呢?

1、《入门示例和流程分析》
2、《未认证的请求是如何重定向到登录地址的》
3、《应用A是如何重定向到授权服务器的授权地址呢?》
4、《授权服务器是如何实现授权的呢?》
5、《登录访问应用A后再访问应用B会发生什么呢?》

1、前言

  通过前面两篇的内容,我们知道:当第一次(未认证的情况下)访问应用A(http://localhost:8082/index)时,首先,会重定向到应用A的登录http://localhost:8082/login地址(Get请求),然后,又会重定向到授权服务器的http://localhost:8080/oauth/authorize地址上,那么为什么会重定向到授权服务器呢,这中间发生了什么呢?我们继续通过代码进行分析。

2、 OAuth2ClientContextFilter和OAuth2ClientAuthenticationProcessingFilter

  当我们在启动类上添加了@EnableOAuth2Sso注解时,会通过自动配置类OAuth2RestOperationsConfiguration,添加一个过滤器OAuth2ClientContextFilter到Servlet Filter过滤器链中,需要注意的是,这和前面提到的SpringSecurity过滤器链是不一样的,它是直接添加到了Servlet Filter过滤器链中,而且是在FilterChainProxy过滤器链之前的,具体如下:
在这里插入图片描述
  同时,也会通过SsoSecurityConfigurer配置类,在SpringSecurity过滤器链中添加一个OAuth2ClientAuthenticationProcessingFilter过滤器,如下所示:
在这里插入图片描述
  当重定向到应用A的http://localhost:8082/login登录地址时,经过OAuth2ClientContextFilter过滤器后,再进入到了SpringSecurity过滤器链中的OAuth2ClientAuthenticationProcessingFilter过滤器中。在OAuth2ClientAuthenticationProcessingFilter中,会进行单点登录的认证,即向授权服务器发送登录验证请求,因为没有携带accessToken或code,这个时候就会抛出异常,然后被前面的OAuth2ClientContextFilter过滤器拦截到,然后在OAuth2ClientContextFilter异常处理逻辑中,实现认证授权地址的重定向。

注意:有人可能会好奇,为什么没有被SpringSecurity过滤器链中的异常过滤器拦截呢?其实,这个时候,还没有到SpringSecurity中的过滤器链呢,所以最终会被OAuth2ClientContextFilter捕获。

3、 过滤器的执行流程

  当重定向到应用A的http://localhost:8082/login登录地址时,会进入OAuth2ClientAuthenticationProcessingFilter的doFilter()方法(实际上是在父类AbstractAuthenticationProcessingFilter中定义的),如下所示:

//AbstractAuthenticationProcessingFilter.java
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
	throws IOException, ServletException {
   
   

	//省略 …… 
	
	Authentication authResult;

	try {
   
   
		//在OAuth2ClientAuthenticationProcessingFilter中实现
		authResult = attemptAuthentication(request, response);
		if (authResult == null) {
   
   
			return;
		}
		sessionStrategy.onAuthentication(authResult, request, response);
	}
	catch (InternalAuthenticationServiceException failed) {
   
   
		unsuccessfulAuthentication(request, response, failed);
		return;
	}
	catch (AuthenticationException failed) {
   
   
		// Authentication failed
		unsuccessfulAuthentication(request, response, failed);
		return;
	}
	// Authentication success
	if 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姠惢荇者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值