如果用户未经授权,Spring Security如何重定向到登录页面

Sac*_*-17 0 spring-security

  • 春季安全授权的内部机制是什么?
  • /Login如果用户没有输入有效凭据,它如何重定向URL ?
  • 谁对此行动负责?
  • 项目的内部流程是什么?

Pav*_*ral 11

所有重要的魔力都在安全过滤器链中.

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

下一个重要的组成部分是ExceptionTranslationFilter.此过滤器检查抛出的异常是否为AuthenticationExceptionAccessDeniedException配置了调用AuthenticationEntryPoint.根据配置的身份验证机制,这可能会将重定向发送到登录页面或使用WWW-Authenticate标头发送401响应(例如BASIC auth).


因此,基于FORM的登录的整个过程看起来像这样(它可能看起来像一团糟,但它实际上设计得很好,一旦你理解了原理就不那么复杂):

  • 未经身份验证的用户请求 /foo.html
    • 请求将FilterSecurityInterceptor根据您的安全表达式进行检查isAuthenticated()并抛出AccessDeniedException
    • 被抛出的异常被捕获ExceptionTranslationFilter,而后者又被调用LoginUrlAuthenticationEntryPoint
    • 入口点发送301重定向响应/login.html
  • 用户发出另一个请求 /login.html
    • 请求FilterSecurityInterceptor由此路径检查,允许匿名访问
    • 登录表单呈现给用户
  • 用户填写登录表单并将其提交为 POST /login.html
    • 此请求被身份验证处理过滤器拦截 UsernamePasswordAuthenticationFilter
    • 提取用户名和密码,并AuthenticationManager调用它来执行实际身份验证(实际身份验证委托给其他组件 - 通常DaoAuthenticationProviderUserDetailsService)
    • 身份验证成功,Authentication令牌被标记为authenticated并被放置SecurityContextHolder(因此可供其他组件使用)
    • AuthenticationSuccessHandler 被调用,可能只是重定向用户 /foo.html
    • 在上升的过程中,成功的身份验证由SecurityContextPersistenceFilter(检查SecurityContextHolder)接收,它在HTTP会话上存储身份验证
  • 用户再次发出请求 /foo.html
    • SecurityContextPersistenceFilter 从会话恢复身份验证 SecurityContextHolder
    • FilterSecurityInterceptor 再次检查您的访问规则,并允许进一步处理新近验证的请求(即调用调度程序servlet)
    • 用户喜欢他的 /foo.html