二次校验
二次校验就是将系统中的资源分为敏感的和不敏感的,如果用户使用了 RememberMe 的方式登录,则访问敏感资源时会自动跳转到登录页面,要求用户重新登录;如果使用了用户名密码的方式登录,则可以访问所有资源。这种方式相当于牺牲了一点用户体验,但是却换取了系统安全。
配置方式也很简单,首先我们提供三个测试接口,代码如下:
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/admin")
public String admin() {
return "admin";
}
@GetMapping("/rememberme")
public String rememberme() {
return "rememberme";
}
}
现在假设:
-
/hello 接口:认证后才可以访问,无论通过何种认证方式。
-
/admin 接口:认证后才可以访问,但是必须是通过用户名/密码的方式认证。
-
/rememberme 接口:认证后才可以访问,但是必须是通过 RememberMe 的方式认证。
在 SecurityConfig 中进行配置(在 6.3 节的 SecurityConfig 基础上修改 HttpSecurity 配置即可):
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin").fullyAuthenticated()
.antMatchers("/rememberme").rememberMe()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.rememberMe()
.key("javaboy")
.tokenRepository(jdbcTokenRepository())
.and()
.csrf().disable();
}
}
配置完成后,重启项目进行测试。使用用户名/密码登录成功后,访问 /hello 接口和 /admin 接口是没有问题的。如果访问 /rememberme 接口,则会出现如图6-6所示的错误提示,表示没有权限访间。

Figure 1. 图6-6 基于用户名/密码登录成功后没有权限访问/rememberme接口
此时关闭浏览器再重新打开,就可以访问 /rememberme 接口了,但是如果去访问 /admin 接口,则系统会自动跳转到登录页面,要求用户重新登录。
至此,RememberMe 的使用基本上就和大家介绍完了,接下来我们通过源码,对其原理进行深入分析。