天天看点

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

文章目录

  • ​​1.用户注销​​
  • ​​2.自动登录原理分析​​
  • ​​2.1 认证请求​​
  • ​​2.2 服务请求​​
  • ​​3.自动登录功能实现​​
  • ​​3.1 数据库准备​​
  • ​​3.2 配置类注入数据源​​
  • ​​3.3 设置configure​​
  • ​​3.4 设置页码选项​​
  • ​​3.5 测试​​

1.用户注销

用户注销: 表示退出之前可以直接登录, 用户注销之后需要密码和用户才可以登录

配置类:

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

这个意思是修改配置类, 使得登录成功以后跳转到成功的页面, 然后成功的页面上有退出的按钮。

如果没有按的时候, 会直接登录, 如果按后需要认证。

Spring Security (用户注销 + 自动登录(RememberMe)) (三)
Spring Security (用户注销 + 自动登录(RememberMe)) (三)
Spring Security (用户注销 + 自动登录(RememberMe)) (三)
Spring Security (用户注销 + 自动登录(RememberMe)) (三)

当不按的时候, 直接访问localhost:8111/test/hello, 直接访问

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

当点击退出后, 则需要认证

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

2.自动登录原理分析

自动登录实现:

  • cookie
  • 安全框架SpringSecurity

安全框架SpringSecurity 实现原理:

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

SpringSecurity对于这个功能有了很多的封装

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

2.1 认证请求

  1. UsernamePasswordAuthenticationFilter -> AbstractAuthenticationProcessingFilter
  2. AbstractAuthenticationProcessingFilter#successfulAuthentication()
    Spring Security (用户注销 + 自动登录(RememberMe)) (三)
  3. AbstractRememberMeServices#loginSuccess()
Spring Security (用户注销 + 自动登录(RememberMe)) (三)
  1. PersistentTokenBasedRememberMeServices#onLoginSuccess()
    Spring Security (用户注销 + 自动登录(RememberMe)) (三)
    生成token, 然后添加到cookie中
Spring Security (用户注销 + 自动登录(RememberMe)) (三)
  1. JdbcTokenRepositoryImpl#createNewToken()

通过上面的步骤将token写入到数据库中。

2.2 服务请求

  1. RememberMeAuthenticationFilter#doFilter()
Spring Security (用户注销 + 自动登录(RememberMe)) (三)
  1. AbstractRememberMeServices#autoLogin()
Spring Security (用户注销 + 自动登录(RememberMe)) (三)
  1. 认证代码:
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 数据库准备

Spring Security (用户注销 + 自动登录(RememberMe)) (三)
Spring Security (用户注销 + 自动登录(RememberMe)) (三)

3.2 配置类注入数据源

@Autowired
    private DataSource dataSource;

    @Bean
    public PersistentTokenRepository persistentTokenRepository(){
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        return tokenRepository;
    }      

3.3 设置configure

Spring Security (用户注销 + 自动登录(RememberMe)) (三)
.and().rememberMe().tokenRepository(persistentTokenRepository())
                .tokenValiditySeconds(60)// 60S
                .userDetailsService(userDetailsService)      

3.4 设置页码选项

这里必须为 type=“checkbox” name=“remember-me”

Spring Security (用户注销 + 自动登录(RememberMe)) (三)

3.5 测试

​​http://localhost:8111/success.html​​

Spring Security (用户注销 + 自动登录(RememberMe)) (三)
Spring Security (用户注销 + 自动登录(RememberMe)) (三)

直接登录进去