[Spring Security] auth2篇

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的登陆页面,然后输出到页面,也就有了我们看到的授权认证的登陆页面了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值