【Spring Security】 登出

Metadata

title: 【Spring Security】 登出
date: 2023-02-02 14:53
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/SpringSecurity
categories:
  - SpringSecurity
keywords:
  - SpringSecurity
description: 【Spring Security】 登出

【Spring Security】 登出

之前我们了解到,spring security 提供了登录页面,那么是否也提供了登录退出页面呢?答案是肯定的,我们只要输入 http://localhost:9090/logout ,就出现了登录退出页面。

当点击了退出后,跳转到了登录页。

登录退出的配置类为 LogoutConfigurer,在 HttpSecurity 配置加载时,会创建该配置项。

    // HttpSecurity 代码片段
    public LogoutConfigurer<HttpSecurity> logout() throws Exception {
        return getOrApply(new LogoutConfigurer<>());
    }

LogoutConfigurer 核心配置如下:

public final class LogoutConfigurer<H extends HttpSecurityBuilder<H>>
        extends AbstractHttpConfigurer<LogoutConfigurer<H>, H> {
    // 退出时要执行的处理器,可以有多个, contextLogoutHandler 总是最后一个
    private List<LogoutHandler> logoutHandlers = new ArrayList<>();

    private SecurityContextLogoutHandler contextLogoutHandler = new SecurityContextLogoutHandler();

    // 成功退出登录跳转路径
    private String logoutSuccessUrl = "/login?logout";
    // 退出登录成处理器
    private LogoutSuccessHandler logoutSuccessHandler;
    // 退出登录页面路径
    private String logoutUrl = "/logout";

    private RequestMatcher logoutRequestMatcher;
    // 是否允许所有
    private boolean permitAll;
    // 是否自定义成功登出
    private boolean customLogoutSuccess;
}

可以自定义退出功能:

@Override
protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() //... .
    and() .logout() 
     .logoutUrl("/logout") 
      .logoutSuccessUrl("/login‐view?logout") 
       .logoutSuccessHandler(logoutSuccessHandler) 
    .addLogoutHandler(logoutHandler)
    .invalidateHttpSession(true); 
}

当退出操作出发时,将发生:

  • 使 HTTP Session 无效
  • 清除 SecurityContextHolder
  • 跳转到 /login-view?logout

LogoutHandler 接口定义了退出的相关操作。

public interface LogoutHandler {

    /**
     * Causes a logout to be completed. The method must complete successfully.
     *
     * @param request        the HTTP request
     * @param response       the HTTP response
     * @param authentication the current principal details
     *                       导致注销完成。该方法必须成功完成
     */
    void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication);
}

LogoutHandler 的实现类如下图:

  • PersistentTokenBasedRememberMeServices 基于持久化 token 的 RememberMe 功能的相关清理
  • TokenBasedRememberMeService 基于 token 的 RememberMe 功能的相关清理
  • CookieClearingLogoutHandler 退出时 Cookie 的相关清理
  • CsrfLogoutHandler 负责在退出时移除 csrfToken
  • SecurityContextLogoutHandler 退出时 SecurityContext 的相关清理