你可能会想知道系统提示您登录时登录表单从哪里来的,因为我们都没有提供任何的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参数,了解更多查阅后续“包含CSRFToken”和“跨站请求伪造(CSRF)”相关章节;