Spring Security 参考手册

Java配置和表单登录

你可能会想知道系统提示您登录时登录表单从哪里来的,因为我们都没有提供任何的HTML或JSP文件。由于Spring Security的默认配置并没有明确设定一个登录页面的URL,Spring Security自动生成一个,基于这个功能被启用,使用默认URL处理登录的提交内容,登录后跳转的URL等等。

自动生成的登录页面可以方便应用的快速启动和运行,大多数应用程序都需要提供自己的登录页面。要做到这一点,我们可以更新我们的配置,如下所示:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login") //注1
            .permitAll();        //注2
}
  1. 指定登陆页的路径
  2. 我们必须允许所有用户访问我们的登录页 (例如未验证的用户) ,这个formLogin().permitAll() 方法允许基于表单登录的所有URL的所有用户的访问。

一个我们当前配置使用的JSP实现的页面如下:

下面这个登陆页是我们的当前配置,如果不符合我们的要求我们可以很容易的更新我们的配置。

     <c:url value="/login" var="loginUrl"/>
    <form action="${loginUrl}" method="post">   <!-- 1 -->
        <c:if test="${param.error != null}">     <!-- 2  -->
            <p>
                Invalid username and password.
            </p>
        </c:if>
        <c:if test="${param.logout != null}">    <!-- 3  -->
            <p>
                You have been logged out.
            </p>
        </c:if>
        <p>
            <label for="username">Username</label>
            <input type="text" id="username" name="username"/><!-- 4  -->
        </p>
        <p>
            <label for="password">Password</label>
            <input type="password" id="password" name="password"/><!-- 5  -->    </p>
        <input type="hidden"  
            name="${_csrf.parameterName}"
            value="${_csrf.token}"/><!-- 6  -->
        <button type="submit" class="btn">Log in</button>
    </form>
  1. 一个POST请求到/login用来验证用户
  2. 如果参数有错误,验证尝试失败
  3. 如果请求参数logout存在则登出
  4. 登录名参数必须被命名为username
  5. 密码参数必须被命名为password
  6. CSRF参数,了解更多查阅 后续“包含CSRF Token” 和 "跨站请求伪造(CSRF)"相关章节