Remember-Me(记住我)认证:基于持久化的令牌方法

基于持久化的令牌方法

这种方法使用数据库来存储令牌信息。这种方法是基于 http://jaspan.com/improved_persistent_login_cookie_best_practice 文章所做出的小修改。使用这种方法可以提供一个数据源引用:

create table persistent_logins (username varchar(64) not null,
                                series varchar(64) primary key,
                                token varchar(64) not null,
                                last_used timestamp not null)

PersistentTokenBasedRememberMeServices

这个类可以使用相同的方式 TokenBasedRememberMeServices,但它还需要配置一个 PersistentTokenRepository 来存储令牌。有两个标准实现。

  • InMemoryTokenRepositoryImpl :仅用于测试。
  • JdbcTokenRepositoryImpl :存储令牌到数据库中。

本例,我们将使用 JdbcTokenRepositoryImpl 将令牌存储到数据库中:

@Autowired
private DataSource dataSource;
@Bean
public JdbcTokenRepositoryImpl tokenRepository() {
    JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
    tokenRepository.setCreateTableOnStartup(true);   // 启动时自动建表,但重启数据会丢失
    tokenRepository.setDataSource(dataSource);
    return tokenRepository;
};

其中 setCreateTableOnStartup 方法是可选的,如果设置为  true ,则会自动创建 persistent_logins 表结构,但缺点是,原有的数据将会丢失。

配置

.rememberMe().key(KEY).tokenRepository(tokenRepository()) 指明 PersistentTokenRepository 的实现方式。

完整配置如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/css/**", "/js/**", "/fonts/**", "/index").permitAll() // 都可以访问
            .antMatchers("/h2-console/**").permitAll() // 都可以访问
            .antMatchers("/users/**").hasRole("USER") // 需要相应的角色才能访问
            .antMatchers("/admins/**").hasRole("ADMIN") // 需要相应的角色才能访问
            .and()
            .formLogin()   //基于 Form 表单登录验证
            .loginPage("/login").failureUrl("/login-error") // 自定义登录界面
            .and().rememberMe().key(KEY).tokenRepository(tokenRepository()) // 启用 remember me
            .and().exceptionHandling().accessDeniedPage("/403");  // 处理异常,拒绝访问就重定向到 403 页面
    http.csrf().ignoringAntMatchers("/h2-console/**"); // 禁用 H2 控制台的 CSRF 防护
    http.headers().frameOptions().sameOrigin(); // 允许来自同一来源的H2 控制台的请求
}

运行

登录后,可以看到 Cookie 里面看到 Remember-Me 的令牌值:

uchijiuhuadelingpaifangfa\_1.png

我们也可以在数据中看到这个登录信息:

uchijiuhuadelingpaifangfa\_2.png

当用户注销后,该数据信息自动会删除。

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""