Spring Security身份验证详细介绍( 五 )

关于默认HTML表单有几个关键点:

  • 表单应该执行到/login的post提交 。
  • 该表单将需要包括一个CSRF令牌,由Thymeleaf自动包含 。
  • 表单应该在名为username的参数中指定用户名
  • 表单应该在名为password的参数中指定密码
  • 如果发现HTTP参数error,则表示用户未能提供有效的用户名/密码
  • 如果发现HTTP参数logout,则表示用户注销成功
许多用户只需要定制登录页面 。但是,如果需要的话,上面的一切都可以通过额外的配置进行定制 。
如果您正在使用Spring MVC,您将需要一个控制器,将GET /login映射到我们创建的登录模板 。LoginController的最小示例如下:
@Controllerclass LoginController {@GetMapping("/login")String login() {return "login";}}
  • 基本身份验证
下面详细介绍Spring Security如何为基于servlet的应用程序提供对基本HTTP身份验证的支持 。
让我们看看HTTP基本身份验证是如何在Spring Security中工作的 。首先,我们看到WWW-Authenticate头被发回给一个未经过身份验证的客户端 。
Spring Security身份验证详细介绍

文章插图
发送WWW-Authenticate头
该图构建了我们的SecurityFilterChain图解 。
①首先,用户向未授权的资源/private发出未经身份验证的请求 。
②Spring Security的FilterSecurityInterceptor通过抛出AccessDeniedException来拒绝未经身份验证的请求 。
③由于用户没有经过身份验证,
ExceptionTranslationFilter将启动启动身份验证 。配置的AuthenticationEntryPoint是一个BasicAuthenticationEntryPoint的实例,它发送一个WWW-Authenticate头 。RequestCache通常是一个不保存请求的NullRequestCache,因为客户端能够重复它最初请求的请求 。
当客户端接收到WWW-Authenticate报头时,它知道应该用用户名和密码重试 。下面是正在处理的用户名和密码的流程 。
Spring Security身份验证详细介绍

文章插图
Spring Security身份验证详细介绍

文章插图
验证用户名和密码
该图构建了我们的SecurityFilterChain图解 。
①当用户提交他们的用户名和密码时,BasicAuthenticationFilter通过从HttpServletRequest中提取用户名和密码来创建
UsernamePasswordAuthenticationToken,这是一种身份验证类型 。
②接下来,将
UsernamePasswordAuthenticationToken传递到AuthenticationManager中进行身份验证 。AuthenticationManager的详细信息取决于用户信息的存储方式 。
③如果身份验证失败,则失败
    • 清除SecurityContextHolder 。
    • RememberMeServices.loginFail被调用 。请记住我没有配置,这是不允许操作的 。
    • AuthenticationEntryPoint被调用来触发WWW-Authenticate再次发送 。
④如果身份验证成功,则成功 。
  • 在SecurityContextHolder上设置Authentication 。
  • RememberMeServices.loginSuccess被调用 。请记住我没有配置,这是不允许操作的 。
  • BasicAuthenticationFilter调用FilterChain.doFilter(request,response)来继续应用程序逻辑的其余部分 。
默认情况下,Spring Security的HTTP基本身份验证支持是启用的 。但是,只要提供了任何基于servlet的配置,就必须显式地提供HTTP Basic 。
一个最小的,显式的配置如下所示:
protected void configure(HttpSecurity http) {http// ....httpBasic(withDefaults());}
  • 摘要式身份验证
下面详细介绍Spring Security如何提供摘要身份验证支持,摘要身份验证是由
DigestAuthenticationFilter提供的 。
您不应该在现代应用程序中使用摘要身份验证,因为它被认为不安全 。最明显的问题是必须以明文、加密或MD5格式存储密码 。所有这些存储格式都是不安全的 。相反,您应该使用单向自适配密码哈希(即bCrypt, PBKDF2, SCrypt等)存储凭证,这是摘要认证不支持的 。
摘要身份验证试图解决基本身份验证的许多弱点,特别是通过确保凭证永远不会通过网络以明文发送 。许多浏览器支持摘要身份验证 。
管理HTTP摘要身份验证的标准由RFC 2617定义,它更新了RFC 2069规定的摘要身份验证标准的早期版本 。大多数用户代理实现RFC 2617 。Spring Security的摘要认证支持与RFC 2617规定的“auth”质量保护(qop)兼容,它还提供了与RFC 2069的向后兼容性 。摘要身份验证被认为是一个更有吸引力的选择,如果你需要使用未加密的HTTP(即没有TLS/HTTPS),并希望最大限度地安全性的身份验证过程 。无论如何,每个人都应该使用HTTPS 。


推荐阅读