Java 当我们在SpringSecurity中使用安全API时,调用的顺序是什么?
我对春天的学习还不熟悉。 我找不到太多的资源来解释当我们在spring中遇到一个安全API时发生的事件序列 考虑以下场景: 我想让用户通过点击一个/authenticate端点来登录 在这种情况下,我可以看到涉及到几个不同的类: 1) WebSecurityConfigAdapter(允许我们指定安全性以及哪些角色可以访问特定端点) 2) OncePerRequestFilter类(它截取每个请求,验证它,并在上下文中设置当前经过身份验证的主体) 3) AuthenticationProvider类 4) 抽象身份验证令牌类Java 当我们在SpringSecurity中使用安全API时,调用的顺序是什么?,java,spring,spring-boot,spring-mvc,spring-security,Java,Spring,Spring Boot,Spring Mvc,Spring Security,我对春天的学习还不熟悉。 我找不到太多的资源来解释当我们在spring中遇到一个安全API时发生的事件序列 考虑以下场景: 我想让用户通过点击一个/authenticate端点来登录 在这种情况下,我可以看到涉及到几个不同的类: 1) WebSecurityConfigAdapter(允许我们指定安全性以及哪些角色可以访问特定端点) 2) OncePerRequestFilter类(它截取每个请求,验证它,并在上下文中设置当前经过身份验证的主体) 3) AuthenticationProvide
在api调用的生命周期中,这些类在何时何地被调用。是否有人可以帮助我理解或给我指一个资源,从序列的角度清楚地解释它Spring security是一个基于过滤器的框架,它安装了一道墙(HttpFireWall)在应用程序使用代理过滤器或spring管理的bean之前。您的请求必须通过多个过滤器才能到达API Spring安全性中的执行顺序
WebAsyncManagerIntegrationFilter
提供SecurityContext和SpringWeb的WebAsyncManager之间的集成。SecurityContextPersistenceFilter
此筛选器将仅在每个请求中执行一次,使用在请求之前从配置的SecurityContextRepository获得的信息填充SecurityContextHolder,并在请求完成并清除上下文持有者后将其存储回存储库。已检查现有会话的请求。若有新请求,将创建SecurityContext;若请求有会话,则将从respository获取现有安全上下文
HeaderWriterFilter
筛选实现,将头添加到当前响应中LogoutFilter
如果请求url是/logout
(对于默认配置),或者如果请求url匹配器在LogoutConfigurer
中配置,则
- 清除安全上下文
- 使会话无效
- 删除在
LogoutConfigurer
- 重定向到默认的注销成功url
/
或已配置的注销成功url或调用已配置的logoutSuccessHandler
UsernamePasswordAuthenticationFilter
- 对于loginProcessingUrl以外的任何请求url,此筛选器将不会进一步处理,但筛选器链将继续
- 如果请求的URL是匹配的(必须是
),则默认HTTP POST
或匹配/login
在.loginProcessingUrl()
中配置,然后FormLoginConfiguler
尝试身份验证UsernamePasswordAuthenticationFilter
- 默认登录表单参数为用户名和密码,可由
,usernameParameter(String)
覆盖passwordParameter(String)
- 设置
.loginPage()
- 在尝试身份验证时
- 将创建一个对象(
或自定义身份验证筛选器中的任何身份验证实现)李>UsernamePasswordAuthenticationToken
- 和
将被调用authenticationManager.authenticate(authToken)
- 请注意,我们可以配置任意数量的
authenticate方法尝试所有身份验证提供程序并检查任何身份验证提供程序AuthenticationProvider
支持的身份验证令牌/身份验证对象,支持的身份验证提供程序将用于身份验证。并在验证成功的情况下返回验证对象,否则抛出
AuthenticationException
- 将创建一个对象(
- 如果将创建身份验证成功会话,并将调用
,从而重定向到配置的目标url(默认值为authenticationSuccessHandler
)/
- 若身份验证失败,则该用户将成为未经身份验证的用户,并且链将继续
SecurityContextHolderAwareRequestFilter
,如果您使用它在servlet容器中安装支持Spring安全性的HttpServletRequestWrapperAnonymousAuthenticationFilter
检测SecurityContextHolder中是否没有身份验证对象,如果未找到身份验证对象,则创建具有授予权限的角色\u ANONYMOUS
身份验证对象(AnonymousAuthenticationToken
)。此处匿名身份验证令牌
有助于在后续请求中识别未经身份验证的用户。ExceptionTranslationFilter
,捕获任何Spring安全异常,以便返回HTTP错误响应或启动适当的AuthenticationEntryPoint过滤器安全接口接受器
将有
FilterSecurityInterceptor
,它几乎是从SecurityContext
获取身份验证对象并获得授权权限列表(授予的角色)的筛选器链中的最后一个,它将决定是否允许此请求到达请求的资源,通过匹配在HttpSecurityConfiguration
中配置的允许的AntMatchers
来做出决定- 试图访问公共资源的未经身份验证的用户-允许
- 试图访问安全资源的未经身份验证的用户-
DEBUG - /app/admin/app-config at position 9 of 12 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter' DEBUG - Populated SecurityContextHolder with anonymous token: 'org.springframework.security.authentication.AnonymousAuthenticationToken@aeef7b36: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS'