Java 当我们在SpringSecurity中使用安全API时,调用的顺序是什么?

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

我对春天的学习还不熟悉。 我找不到太多的资源来解释当我们在spring中遇到一个安全API时发生的事件序列

考虑以下场景:

我想让用户通过点击一个/authenticate端点来登录

在这种情况下,我可以看到涉及到几个不同的类:

1) WebSecurityConfigAdapter(允许我们指定安全性以及哪些角色可以访问特定端点)

2) OncePerRequestFilter类(它截取每个请求,验证它,并在上下文中设置当前经过身份验证的主体)

3) AuthenticationProvider类

4) 抽象身份验证令牌类


在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)
        将被调用
      • 请注意,我们可以配置任意数量的
        AuthenticationProvider
        authenticate方法尝试所有身份验证提供程序并检查任何身份验证提供程序
        支持的身份验证令牌/身份验证对象,支持的身份验证提供程序将用于身份验证。并在验证成功的情况下返回验证对象,否则抛出
        AuthenticationException
    • 如果将创建身份验证成功会话,并将调用
      authenticationSuccessHandler
      ,从而重定向到配置的目标url(默认值为
      /
    • 若身份验证失败,则该用户将成为未经身份验证的用户,并且链将继续
  • SecurityContextHolderAwareRequestFilter
    ,如果您使用它在servlet容器中安装支持Spring安全性的HttpServletRequestWrapper

  • AnonymousAuthenticationFilter
    检测SecurityContextHolder中是否没有身份验证对象,如果未找到身份验证对象,则创建具有授予权限的
    角色\u ANONYMOUS
    身份验证对象(
    AnonymousAuthenticationToken
    )。此处
    匿名身份验证令牌
    有助于在后续请求中识别未经身份验证的用户。

  • 调试日志
  • ExceptionTranslationFilter
    ,捕获任何Spring安全异常,以便返回HTTP错误响应或启动适当的AuthenticationEntryPoint

  • 过滤器安全接口接受器

    将有
    FilterSecurityInterceptor
    ,它几乎是从
    SecurityContext
    获取身份验证对象并获得授权权限列表(授予的角色)的筛选器链中的最后一个,它将决定是否允许此请求到达请求的资源,通过匹配在
    HttpSecurityConfiguration
    中配置的允许的
    AntMatchers
    来做出决定

  • 考虑401未授权和403禁止的例外情况。这些决策将在过滤器链的最后一个位置执行

    • 试图访问公共资源的未经身份验证的用户-允许
    • 试图访问安全资源的未经身份验证的用户-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'