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

时间:2015-03-18 07:42:22

标签: spring-security

  • spring-security授权的内部机制是什么?
  • 如果用户未输入有效凭据,如何将网址重定向至/Login
  • 谁对此行动负责?
  • 项目的内部流程是什么?

1 个答案:

答案 0 :(得分:9)

所有重要的魔法都在security filter chain

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

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


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

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