授权码流程
2024-12-13 11:09:27 0 举报
源码层面探究springSecurity授权码流程
作者其他创作
大纲/内容
匹配:/oauth2/authorize
匹配:/logout
匹配:/login/oauth2/code/*,跟OAuth2LoginAuthenticationFilter一样,但是因为位置靠后,所以拿不到该请求,暂时可以不用考虑
OidcLogoutEndpointFilter
登录执行链
OidcUserInfoEndpointFilter
AnonymousAuthenticationFilter
DefaultLoginPageGeneratingFilter
匹配:/oauth2/token,生成token信息
AuthorizationFilter
再转发请求3的时候,会将原始请求存储到session中,以供请求8的时候使用
此处会调用封装了两层的lambda,进而获取SecurityContext中的用户认证信息(UsernamePasswordAuthenticationFilter认证的用户信息),如果此时获取的是匿名用户,那么异常抛出。如果认证信息正确则登录过程完成。
3:ExceptionTranslationFilter捕获异常后,会重新转发到该项目的/oauth2/authorization/{registrationId}路径上
HeaderWriterFilter
1:登录请求/doLogin
8:利用SavedRequestAwareAuthenticationSuccessHandler获取之前存储在session中的原始请求信息,进行重定向转发到客户端项目
SecurityContextHolderFilter
SecurityContextHolderAwareRequestFilter
OAuth2TokenIntrospectionEndpointFilter
OidcProviderConfigurationEndpointFilter
4:该过滤器会将客户端信息等进行组装拼接,然后获取授权服务器的ip地址,向授权服务器发送/oauth2/authorize请求进而获取code信息
匹配:/connect/logout请求
捕获AuthorizationFilter过滤器抛出的异常信息,然后重定向到登录页面或者我们自定义的路径信息
登录后,可以从session中获取认证信息
匹配所有的请求
授权服务器
CorsFilter
DisableEncodeUrlFilter
1:本图只是涵盖了正常前后端项目分离后,授权码正常获取流程,对于授权服务器未登录,客户端直接请求,跳转登录页,还有授权页面授权的情况不再本图中涵盖2:图中相同的过滤器作用功能是一样的3:按照图中标注的请求顺序看比较易于理解
认证通过后,会将认证信息Authentication存储到授权服务项目的session中
OAuth2LoginAuthenticationFilter
CsrfFilter
WebAsyncManagerIntegrationFilter
匹配:/oauth2/revoke,令牌废除
LogoutFilter
响应.well-known/oauth-authorization-server请求,返回授权服务器基础信息
高版本后授权服务器将授权执行链和登录执行链进行了分离,且授权执行链的优先级要比登录执行链的优先级高
匹配:/oauth2/jwks,用来处理JWK信息,资源端验证JWT时
跟授权服务器的功能一样,将SecurityContextHolderFilter封装的获取认证信息的lambda取出,再嵌套一层lambda,再之后获取认证信息失败时以便创建匿名用户。获取的认证信息说白了就是从当前项目的session中获取
匹配:.well-known/openid-configuration,提供OpenID提供者配置信息
AbstractAuthenticationProcessingFilter的子类,对/doLogin请求进行拦截处理,认证处理器为DaoAuthenticationProvider。对请求中的用户名和密码进行校验
客户端项目
OAuth2TokenRevocationEndpointFilter
3:当第7步执行完成后,会拿到比较全的用户信息,然后将该用户信息存储到安全上线文中
匹配:/logout请求
将生成的token信息直接返回给客户端
AuthorizationServerContextFilter
OAuth2AuthorizationCodeGrantFilter
对AuthorizationFilter过滤器抛出的异常进行捕获处理,授权端捕获异常后一般是跳转登录页面,而客户端则是通过LoginUrlAuthenticationEntryPoint将当前请求重定向到当前项目的/oauth2/authorization/{registrationId}路径中
RequestCacheAwareFilter
1:这里进行权限的校验,先校验是否有认证信息,其次再校验权限信息。这里会调用AnonymousAuthenticationFilter中封装的lambda获取安全上下文中的认证信息,首次请求进来时客户端项目中的session中是未进行任何认证信息存储的,所以获取的为匿名信息,所以此处会抛出异常
OAuth2AuthorizationRequestRedirectFilter
OAuth2TokenEndpointFilter
匹配:/oauth2/authorization/{registrationId}
匹配:/login,再客户端项目中无用,登录是在授权服务器进行的
匹配:/oauth2/introspect,令牌自省逻辑,检测有效性
UsernamePasswordAuthenticationFilter
匹配:/oauth2/device_verification,设备授权码模式下用户授权后对user_code进行失效处理
OAuth2AuthorizationEndpointFilter
ExceptionTranslationFilter
访问权限验证
当请求为/oauth2/token时,是远程调用的方式,所以session为null,所以之前用户登录的认证信息无法获取,注意此处是获取的OAuth2ClientAuthenticationFilter存储的客户端认证信息
将返回的用户详细信息返回给客户端
2:访问客户端项目资源
异常捕获处理器
SessionManagementFilter
OAuth2DeviceAuthorizationEndpointFilter
将SecurityContextHolderFilter封装的获取认证信息的lambda取出,再嵌套一层lambda,再之后获取认证信息失败时以便创建匿名。
7:根据获取token信息通过远程调用的方式调用授权服务器的/userinfo获取更详细的用户信息
1:匹配:/login/oauth2/code/*
匹配:/oauth2/device_authorization,font color=\"#e74f4c\
匹配的路径:/oauth2/token、/oauth2/introspect、/oauth2/revoke、/oauth2/device_authorization、/.well-known/oauth-authorization-server、/oauth2/authorize、/oauth2/device_verification、/.well-known/openid-configuration、/connect/logout、/oauth2/jwks、/userinfo
ConcurrentSessionFilter
2:该过滤器拦截/login/oauth2/code/请求,然后拿着code通过font color=\"#e74f4c\
匹配:/userinfo,获取用户信息
匹配:/oauth2/token 、/oauth2/introspect 、/oauth2/revoke、 /oauth2/device_authorization 用来对传递的客户端进行验证,且将认证的客户端信息存储到上下文中
OAuth2AuthorizationServerMetadataEndpointFilter
注意:当第8步的请求进来后,因为第7步之后,再安全上线文中填充了用户认证信息,所以此处不再异常抛出
OAuth2DeviceVerificationEndpointFilter
1:从session中是否能够获取认证信息,如未获取跳转到登录页2:是否进行了授权页配置,如果符合则跳转到授权页面进行授权处理3:生成code,重定向到客户端
从SecurityContextRepository获取到SecurityContext(安全上下文),封装的是lambda表达式,真正使用时才会获取
NimbusJwkSetEndpointFilter
5:该过滤器生成code后,会重定向到客户端项目的/login/oauth2/code/*
BearerTokenAuthenticationFilter
授权利执行链
OAuth2ClientAuthenticationFilter
目标方法
处理Token,将得到的认证信息封装到上下文中,资源端
将在SecurityContextHolderFilter封装的获取SecurityContext(安全上下文)的lambda取出,再进一步封装成嵌套lambda表达式。真正的作用是在SecurityContext中获取不到认证信息就给其创建一个匿名用户
6:通过RestTemplate方式,携带code远程调用授权服务器的/oauth2/token。注意这里是远程调用是没有页面参与跳转的,所以该请求再授权服务器的session是null
收藏
收藏
0 条评论
下一页