Spring security 如果用户未经授权,Spring Security如何重定向到登录页面 spring security的内部授权机制是什么 如果用户未输入有效凭据,如何将URL重定向到/Login 谁对这次行动负责 项目的内部流程是什么

Spring security 如果用户未经授权,Spring Security如何重定向到登录页面 spring security的内部授权机制是什么 如果用户未输入有效凭据,如何将URL重定向到/Login 谁对这次行动负责 项目的内部流程是什么,spring-security,Spring Security,所有重要的魔法都在黑暗中 在某个时刻,某些组件检查请求是否经过身份验证。通常它是最后一个过滤器-(根据请求路径检查访问条件),但它可以是MethodSecurityInterceptor(@securited注释检查),甚至可以是您自己的自定义代码。重要的是,此检查将以抛出AuthenticationException或AccessDeniedException结束 下一个重要组成部分是。此筛选器检查引发的异常是AuthenticationException还是AccessDeniedExcep

所有重要的魔法都在黑暗中

在某个时刻,某些组件检查请求是否经过身份验证。通常它是最后一个过滤器-(根据请求路径检查访问条件),但它可以是
MethodSecurityInterceptor
@securited
注释检查),甚至可以是您自己的自定义代码。重要的是,此检查将以抛出
AuthenticationException
AccessDeniedException
结束

下一个重要组成部分是。此筛选器检查引发的异常是
AuthenticationException
还是
AccessDeniedException
,并调用已配置的
AuthenticationEntryPoint
。根据配置的身份验证机制,这可能会发送重定向到登录页面或401响应,并带有
WWW-Authenticate
标题(例如基本身份验证)


因此,基于表单登录的整个过程看起来是这样的(看起来可能很混乱,但实际上设计得很好,一旦您理解了原理,就不会那么复杂):

  • 未经身份验证的用户向
    /foo.html
    • 通过
      FilterSecurityInterceptor
      根据安全表达式检查请求
      isAuthenticated()
      并抛出
      AccessDeniedException
    • 抛出的异常由
      ExceptionTranslationFilter
      捕获,它依次调用
      LoginRuThenticationEntryPoint
    • 入口点发送
      301
      重定向响应到
      /login.html
  • 用户向
    /login.html
    • 请求由
      FilterSecurityInterceptor
      检查,对于此路径,允许匿名访问
    • 登录表单将呈现给用户
  • 用户填写登录表单并以
    POST/login.html
    • 此请求被身份验证处理筛选器
      UsernamePasswordAuthenticationFilter
    • 提取用户名和密码,并调用
      AuthenticationManager
      执行实际身份验证(实际身份验证委托给其他组件-通常是
      DAOAAuthenticationProvider
      UserDetailsService
    • 身份验证成功,并且
      身份验证
      令牌标记为
      已验证
      ,并置于
      SecurityContextHolder
      (因此它可用于其他组件)
    • 正在调用AuthenticationSuccessHandler,这可能会将用户重定向回
      /foo.html
    • 在向上的过程中,成功的身份验证被
      SecurityContextPersistenceFilter
      (检查
      SecurityContextHolder
      )拾取,它将身份验证存储在HTTP会话上
  • 用户再次请求
    /foo.html
    • SecurityContextPersistenceFilter
      将身份验证从会话恢复到
      SecurityContextHolder
    • FilterSecurityInterceptor
      再次检查您的访问规则,并允许对新验证的请求进行进一步处理(即调用dispatcher servlet)
    • 用户享受自己的
      /foo.html

所有重要的魔法都在黑暗中

在某个时刻,某些组件检查请求是否经过身份验证。通常它是最后一个过滤器-(根据请求路径检查访问条件),但它可以是
MethodSecurityInterceptor
@securited
注释检查),甚至可以是您自己的自定义代码。重要的是,此检查将以抛出
AuthenticationException
AccessDeniedException
结束

下一个重要组成部分是。此筛选器检查引发的异常是
AuthenticationException
还是
AccessDeniedException
,并调用已配置的
AuthenticationEntryPoint
。根据配置的身份验证机制,这可能会发送重定向到登录页面或401响应,并带有
WWW-Authenticate
标题(例如基本身份验证)


因此,基于表单登录的整个过程看起来是这样的(看起来可能很混乱,但实际上设计得很好,一旦您理解了原理,就不会那么复杂):

  • 未经身份验证的用户向
    /foo.html
    • 请求由
      FilterSecurityInterceptor
      根据您的安全表达式
      isAuthenticated()
      进行检查,并抛出
      AccessDeniedException
    • 抛出的异常由
      ExceptionTranslationFilter
      捕获,它依次调用
      LoginRuThenticationEntryPoint
    • 入口点将
      301
      重定向响应发送到
      /login.html
  • 用户向
    /login.html
    • 请求由
      FilterSecurityInterceptor
      检查,对于此路径,允许匿名访问
    • 登录表单将呈现给用户
  • 用户填写登录表单并以
    POST/login.html
    • 此请求被身份验证处理筛选器
      UsernamePasswordAuthenticationFilter
    • 提取用户名和密码,并调用
      AuthenticationManager
      执行实际身份验证(实际身份验证委托给其他组件-通常是
      DAOAAuthenticationProvider
      UserDetailsService
    • 身份验证成功并且
      身份验证
      令牌无效