文章目錄
- 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
直接登入進去