Spring Security(十一):退出登錄

這一篇就來講講如何退出登錄的一些處理,包括如何退出登錄、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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章