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

最低0.47元/天 解锁文章
3510

被折叠的 条评论
为什么被折叠?



