Spring Security 教程(08)、Java配置和表单登录

自定义登录页面

java-config-form-login 配图
java-config-form-login 配图
java-config-form-login 配图

Spring Security 默认提供 /login 页面,但你通常需要自定义登录页以匹配自己的设计风格。

1
2
3
4
5
6
7
8
http.formLogin()
.loginPage("/custom-login") // 自定义登录页 URL
.loginProcessingUrl("/authenticate") // 表单提交的处理 URL
.usernameParameter("username") // 用户名参数名
.passwordParameter("password") // 密码参数名
.defaultSuccessUrl("/dashboard") // 登录成功后的跳转 URL
.failureUrl("/login?error") // 登录失败后的跳转 URL
.permitAll(); // 登录页和登录处理 URL 不需要认证

登录表单示例

1
2
3
4
5
6
7
8
9
10
11
<form th:action="@{/authenticate}" method="POST">
<div th:if="${param.error}" class="alert alert-danger">
用户名或密码错误
</div>
<div th:if="${param.logout}" class="alert alert-success">
已安全退出
</div>
<input type="text" name="username" placeholder="用户名" required/>
<input type="password" name="password" placeholder="密码" required/>
<button type="submit">登录</button>
</form>

登录处理流程

  1. 用户访问受保护资源,被重定向到 /custom-login
  2. 用户输入用户名密码,提交到 /authenticate
  3. UsernamePasswordAuthenticationFilter 拦截请求,提取凭据
  4. AuthenticationManager 验证凭据(查询 UserDetailsService)
  5. 验证成功:创建 Authentication 对象,存入 SecurityContext,重定向到 /dashboard
  6. 验证失败:重定向到 /login?error

记住我功能

1
2
3
4
http.rememberMe()
.key("unique-and-secret") // 用于签名 Token 的密钥
.tokenValiditySeconds(86400) // Token 有效期(秒)
.rememberMeParameter("remember-me"); // 表单中的 Remember-Me 字段名

“记住我”功能通过 Cookie 实现。用户登录后,服务器生成一个加密的 Token 存入 Cookie。下次访问时,服务器验证 Token 自动完成认证,无需再次输入密码。

安全提醒

  • loginProcessingUrl 的 URL 必须与表单的 action 属性一致
  • 登录页和登录处理 URL 必须配置 permitAll(),否则会导致循环重定向
  • key 应该是足够长的随机字符串,防止 Token 被伪造
  • Token 有效期不宜过长,生产环境建议不超过 7 天