文章目录
- 1.用户注销
- 2.自动登录原理分析
- 2.1 认证请求
- 2.2 服务请求
- 3.自动登录功能实现
- 3.1 数据库准备
- 3.2 配置类注入数据源
- 3.3 设置configure
- 3.4 设置页码选项
- 3.5 测试
1.用户注销
用户注销: 表示退出之前可以直接登录, 用户注销之后需要密码和用户才可以登录
配置类:
这个意思是修改配置类, 使得登录成功以后跳转到成功的页面, 然后成功的页面上有退出的按钮。
如果没有按的时候, 会直接登录, 如果按后需要认证。
当不按的时候, 直接访问localhost:8111/test/hello, 直接访问
当点击退出后, 则需要认证
2.自动登录原理分析
自动登录实现:
- cookie
- 安全框架SpringSecurity
安全框架SpringSecurity 实现原理:
SpringSecurity对于这个功能有了很多的封装
2.1 认证请求
- UsernamePasswordAuthenticationFilter -> AbstractAuthenticationProcessingFilter
- AbstractAuthenticationProcessingFilter#successfulAuthentication()
- AbstractRememberMeServices#loginSuccess()
- PersistentTokenBasedRememberMeServices#onLoginSuccess() 生成token, 然后添加到cookie中
- JdbcTokenRepositoryImpl#createNewToken()
通过上面的步骤将token写入到数据库中。
2.2 服务请求
- RememberMeAuthenticationFilter#doFilter()
- AbstractRememberMeServices#autoLogin()
- 认证代码:
public void check(UserDetails user) {
if (!user.isAccountNonLocked()) {
throw new LockedException(messages.getMessage(
"AccountStatusUserDetailsChecker.locked", "User account is locked"));
}
if (!user.isEnabled()) {
throw new DisabledException(messages.getMessage(
"AccountStatusUserDetailsChecker.disabled", "User is disabled"));
}
if (!user.isAccountNonExpired()) {
throw new AccountExpiredException(
messages.getMessage("AccountStatusUserDetailsChecker.expired",
"User account has expired"));
}
if (!user.isCredentialsNonExpired()) {
throw new CredentialsExpiredException(messages.getMessage(
"AccountStatusUserDetailsChecker.credentialsExpired",
"User credentials have expired"));
}
}
3.自动登录功能实现
3.1 数据库准备
3.2 配置类注入数据源
@Autowired
private DataSource dataSource;
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);
return tokenRepository;
}
3.3 设置configure
.and().rememberMe().tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(60)// 60S
.userDetailsService(userDetailsService)
3.4 设置页码选项
这里必须为 type=“checkbox” name=“remember-me”
3.5 测试
http://localhost:8111/success.html
直接登录进去