這一篇就來講講如何退出登錄的一些處理,包括如何退出登錄、Spring Security默認的退出處理邏輯以及退出登錄相關的配置項。
退出處理
如何退出登錄
- 登錄頁
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
index<br>
<a href="/signOut">退出</a>
</body>
</html>
- 需要在主配置類中配置登出,將上面的url配置爲登出路徑,同時配置登出後跳轉頁面
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
.formLogin()
.loginPage("/authentication/require")
.loginProcessingUrl("/authentication/form")
.successHandler(meicloudAuthenticationSuccessHandler)
.failureHandler(meicloudAuthenticationFailureHandler)
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(3600)
.userDetailsService(userDetailsService)
.and()
.authorizeRequests()
.antMatchers("/authentication/require", securityProperties.getBrowser().getSignInPage(), "/code/*").permitAll()
.anyRequest()
.authenticated()
.and()
.logout()
// 配置推出的登錄接口
.logoutUrl("/signOut")
// 退出登錄後跳到的頁面
.logoutSuccessUrl("meicloud-logout.html")
.and()
.csrf().disable()
.apply(smsCodeAuthenticationSecurityConfig);
Spring Security默認的退出處理邏輯
- 使當前
Session失效
- 清除與當前用戶相關的
remember-me記錄
- 清空當前的
SecurityContext
- 重定向到
登錄頁
與退出登錄相關的配置
- 上面只是配置了登出頁面跳轉,和Spring Security默認的一些退出處理邏輯,如果想要退出之前做一些自定義處理,就需要配置登出成功處理器,實現
LogoutSuccessHandler
接口。
public class MeicloudLogoutSuccessHandler implements LogoutSuccessHandler {
private Logger logger = LoggerFactory.getLogger(getClass());
public MeicloudLogoutSuccessHandler(String signOutSuccessUrl) {
this.signOutSuccessUrl = signOutSuccessUrl;
}
private String signOutSuccessUrl;
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
logger.info("退出成功");
// 具體退出登錄還要做啥,可以自定義,比如記錄退出登錄的一些信息等
if (StringUtils.isBlank(signOutSuccessUrl)) {
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write(objectMapper.writeValueAsString(new SimpleResponse("退出成功")));
} else {
response.sendRedirect(signOutSuccessUrl);
}
}
}
- 需要將這個自定義的登出處理器
MeicloudLogoutSuccessHandler
配置到主配置類,注意logoutSuccessHandler
配置項和logoutSuccessUrl
配置項是互斥的。
http.addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class)
.formLogin()
.loginPage("/authentication/require")
.loginProcessingUrl("/authentication/form")
.successHandler(meicloudAuthenticationSuccessHandler)
.failureHandler(meicloudAuthenticationFailureHandler)
.and()
.rememberMe()
.tokenRepository(persistentTokenRepository())
.tokenValiditySeconds(3600)
.userDetailsService(userDetailsService)
.and()
.authorizeRequests()
.antMatchers("/authentication/require", securityProperties.getBrowser().getSignInPage(), "/code/*").permitAll()
.anyRequest()
.authenticated()
.and()
.logout()
// 配置推出的登錄接口
.logoutUrl("/signOut")
// 退出登錄後跳到的頁面
// .logoutSuccessUrl("meicloud-logout.html")
// 配置登出成功處理器
.logoutSuccessHandler(logoutSuccessHandler)
.and()
.csrf().disable()
.apply(smsCodeAuthenticationSecurityConfig);
- 退出過程中還需要把瀏覽器的cookie信息清除掉,對應的配置項是
deleteCookies
.logout()
// 配置推出的登錄接口
.logoutUrl("/signOut")
// 退出登錄後跳到的頁面
// .logoutSuccessUrl("meicloud-logout.html")
// 配置登出成功處理器
.logoutSuccessHandler(logoutSuccessHandler)
.deleteCookies("JSESSIONID")
.and()