在上一篇博客中,在自定义的配置类中,增加数据源的注入,增加一个PersistentTokenRepository 的Bean
@Autowired
private DataSource dataSource;
@Autowired
private PersistentTokenRepository persistentTokenRepository;
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl jdbcTokenRepository = new JdbcTokenRepositoryImpl();
jdbcTokenRepository.setDataSource(dataSource);
// 第一次启动的时候自动创建表,其他时候注释掉
jdbcTokenRepository.setCreateTableOnStartup(true);
return jdbcTokenRepository;
}
关于为什么是这个Bean类,需要底层了解源码原理
记住我的功能,一方面把cookie保存在浏览器客户端,同时也把用户登录信息存入了数据库,在有效期类实现自动登录。
在重写方法中增加配置时长
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html") // 设置登录页面地址
.loginProcessingUrl("/test/login") // 设置登录页处理地址form 表单的action地址,路径随意,这个配置配合上面的登录地址
// .successForwardUrl("/success.html") // 设置成功跳转地址
// .failureUrl("/error.html") // 设置失败跳转地址
.defaultSuccessUrl("/test/default")
// .usernameParameter("uname") // 表单不是username
// .passwordParameter("pword") // 表单不是password
.permitAll() // 设置默认成功跳转页面
.and().authorizeRequests().antMatchers("/","/test/login").permitAll()// 设置不用认证的地址
//.antMatchers("/test/index").hasAuthority("add")
//.antMatchers("/test/index").hasAnyAuthority("add,delete")
//.antMatchers("/test/index").hasRole("sale")
//.antMatchers("/test/index").hasAnyRole("sale")
.anyRequest().authenticated() //其他请求需要认证授权
.and().rememberMe()
.tokenValiditySeconds(60) // 设置记住我的时间,单位秒
.tokenRepository(persistentTokenRepository).userDetailsService(myUserDetailsService)
.and().csrf().disable(); // 关闭csrf防护
// 自定义403错误页面
http.exceptionHandling().accessDeniedPage("/error.html");
http.logout().logoutUrl("/logout").logoutSuccessUrl("/test/index").permitAll();
}
可以看到自动创建了表
在自定义的登录页面添加一个name为remember-me的CheckBox,这样就实现了记住我的功能。