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

  • 表单登录
Spring Security支持通过html表单提供用户名和密码 。下面详细介绍基于表单的身份验证如何在Spring Security中工作 。
让我们看看基于表单的登录是如何在Spring Security中工作的 。首先,我们将看到如何将用户重定向到登录表单页面 。
Spring Security身份验证详细介绍

文章插图
重定向到登录页面
该图构建了我们的SecurityFilterChain图解 。
①首先,用户向未授权的资源/private发出未经身份验证的请求 。
②Spring Security的FilterSecurityInterceptor通过抛出AccessDeniedException来拒绝未经身份验证的请求 。
③由于用户没有经过身份验证,
ExceptionTranslationFilter将启动Start Authentication并发送一个重定向到配置了AuthenticationEntryPoint的登录页面 。在大多数情况下,AuthenticationEntryPoint是LoginUrlAuthenticationEntryPoint的一个实例 。
【Spring Security身份验证详细介绍】④然后,浏览器将请求重定向到登录页面 。
⑤应用程序内的某些东西必须呈现登录页面 。
提交用户名和密码后,
UsernamePasswordAuthenticationFilter将对用户名和密码进行验证 。UsernamePasswordAuthenticationFilter扩展了AbstractAuthenticationProcessingFilter,所以下面的流程图看起来应该很相似 。
Spring Security身份验证详细介绍

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

文章插图
验证用户名和密码
该图构建了我们的SecurityFilterChain图解 。
①当用户提交他们的用户名和密码时,
UsernamePasswordAuthenticationFilter通过从HttpServletRequest中提取用户名和密码创建UsernamePasswordAuthenticationToken,这是一种Authentication类型 。
②接下来,将
UsernamePasswordAuthenticationToken传递到AuthenticationManager中进行身份验证 。AuthenticationManager的详细信息取决于用户信息的存储方式 。
③如果身份验证失败,则失败
    • 清除SecurityContextHolder 。
    • RememberMeServices.loginFail被调用 。请记住我没有配置,这是不允许操作的 。
    • AuthenticationFailureHandler被调用 。
④如果身份验证成功,则成功 。
  • SessionAuthenticationStrategy会在新登录时得到通知 。
  • Authentication在SecurityContextHolder上设置 。稍后,securitycontextpersistencfilter将SecurityContext保存到HttpSession 。
  • RememberMeServices.loginSuccess被调用 。请记住我没有配置,这是不允许操作的 。
  • ApplicationEventPublisher发布一个InteractiveAuthenticationSuccessEvent 。
  • AuthenticationSuccessHandler被调用 。通常这是一个SimpleUrlAuthenticationSuccessHandler,当我们重定向到登录页面时,它将重定向到ExceptionTranslationFilter保存的请求 。
Spring Security表单登录在默认情况下是启用的 。但是,只要提供了任何基于servlet的配置,就必须显式地提供基于表单的登录 。
一个最小的、显式的Java配置如下所示:
protected void configure(HttpSecurity http) {http// ....formLogin(withDefaults());}在这个配置中,Spring Security将呈现一个默认的登录页面 。大多数生产应用程序都需要一个自定义的登录表单 。
下面的配置演示了如何在表单中提供自定义登录页面 。
protected void configure(HttpSecurity http) throws Exception {http// ....formLogin(form -> form.loginPage("/login").permitAll());}当在Spring Security配置中指定登录页面时,您将负责呈现该页面 。下面是一个Thymeleaf模板,它生成一个符合/login登录页面的HTML登录表单:
示例:登录表单
路径:
src/main/resources/templates/login.html
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"><head><title>Please Log In</title></head><body><h1>Please Log In</h1><div th:if="${param.error}">Invalid username and password.</div><div th:if="${param.logout}">You have been logged out.</div><form th:action="@{/login}" method="post"><div><input type="text" name="username" placeholder="Username"/></div><div><input type="password" name="password" placeholder="Password"/></div><input type="submit" value=https://www.isolves.com/it/cxkf/jiagou/2022-09-14/"Log in" />


推荐阅读