天天看點

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)) (三)

直接登入進去