二次校验

二次校验就是将系统中的资源分为敏感的和不敏感的,如果用户使用了 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";
    }
}

现在假设:

  1. /hello 接口:认证后才可以访问,无论通过何种认证方式。

  2. /admin 接口:认证后才可以访问,但是必须是通过用户名/密码的方式认证。

  3. /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所示的错误提示,表示没有权限访间。

image 2024 04 13 11 35 44 945
Figure 1. 图6-6 基于用户名/密码登录成功后没有权限访问/rememberme接口

此时关闭浏览器再重新打开,就可以访问 /rememberme 接口了,但是如果去访问 /admin 接口,则系统会自动跳转到登录页面,要求用户重新登录。

至此,RememberMe 的使用基本上就和大家介绍完了,接下来我们通过源码,对其原理进行深入分析。