OAuth2ProtectedResourceDetails:yml配置的资源配置的实现类,这是一个接口,在oauth2这个依赖下面。
BaseOAuth2ProtectedResourceDetails是实现之一
当clientA调用securedPage后是在
LoginUrlAuthenticationEntryPoint的commence判断没有权限后,然后调用的localhost:8201/login
然后通过AbstractAuthenticationProcessingFilter的doFilter然后就去执行授权码的哪个请求,就会调到server端了
server端发现没有权限,然后就重定向到server端的登陆页面了
OAuth2ClientContextFilter
FilterSecurityInterceptor ——> AbstractSecurityInterceptor[beforeInvocation][检测当前url是否需要进行验证]
AffirmativeBased[decide][决定是否有权限访问]
|-- WebExpressionVoter[vote][通过投票决定当前访问的url是否被DENIED,
如果denied也就是说必须有权限才能访问,那么就会抛出AccessDeniedException异常],上层[ExceptionTranslationFilter]接到这个异常后调用[sendStartAuthentication]
然后通过[authenticationEntryPoint.commence(DelegatingAuthenticationEntryPoint)],在这个方法方法里会找到【LoginUrlAuthenticationEntryPoint】,
然后通过他的[commence]就会发起一个localhost:8301/login的重定向请求(这个url实在这个类中组建出来的),
然后AbstractAuthenticationProcessingFilter的doFilter方法中发现了这个/login的url,就不会跳到其他的filter了,而是自己来进行处理,
它会调用[OAuth2ClientAuthenticationProcessingFilter]的[attemptAuthentication],这个方法中会获取各种token,其中就包括通过[AuthorizationCodeAccessTokenProvider]
的[obtainAccessToken],这个方法会先去看是否能从当前request拿到code,如果拿不到就抛出一个[throw getRedirectForAuthorization(resource, request);]异常,这个方法里就
生成了我们获取授权码的哪个url的相关信息,然后放到异常类[UserRedirectRequiredException]向外抛出,抛出后就会被[OAuth2ClientContextFilter]捕获到,然后通过[redirectUser(redirect, request, response)]
将参数组合到url中,最后生成获取授权码code的那个url,然后发起重定向请求,然后就会调用到我们oauth2的server了,
server端是如何跳转到自己的登陆页面的呢?
oauth2 server收到[/auth/oauth/authorize/后面部分省略]这个获取授权码的请求后,然后再次执行与上面client端相同的过程,如下:
FilterSecurityInterceptor ——> AbstractSecurityInterceptor[beforeInvocation][检测当前这个获取授权码的url是否需要进行验证]
AffirmativeBased[decide][决定是否有权限访问]
|-- WebExpressionVoter[vote][通过投票决定当前访问的这个获取授权码的url是否被DENIED(因为还没在oauth2 server登录过,所以这个url肯定没权限),
如果denied也就是说必须有权限才能访问,那么就会抛出AccessDeniedException异常],上层[ExceptionTranslationFilter]接到这个异常后调用[sendStartAuthentication]
然后通过[authenticationEntryPoint.commence(DelegatingAuthenticationEntryPoint)],在这个方法方法里会找到【LoginUrlAuthenticationEntryPoint】,
然后通过他的[commence]就会发起一个localhost:8300/auth/login的重定向请求(这个url实在这个类中组建出来的),
然后[DefaultLoginPageGeneratingFilter]的[doFilter]会处理这个请求,在这里生成oauth2 server的登陆页面,然后输出到页面,也就有了我们看到的授权认证的登陆页面了。