zoukankan      html  css  js  c++  java
  • Spring Security 登出

    Spring Security 登出

    # 默认退出处理逻辑

    • 使当前session失效
    • 清除配置的RememberMe认证, 会清空数据库中的token
    • 清空SecurityContextHolder
    • 重定向到/login?logout

    关键类LogoutConfigurer

    观察发发现, /logout针对多种请求方式

    注意的一点是 loginUrl()的注解

    The URL that triggers log out to occur (default is "/logout"). If CSRF protection
    is enabled (default), then the request must also be a POST. This means that by
    default POST "/logout" is required to trigger a log out. If CSRF protection is
    disabled, then any HTTP method is allowed.

    			this.logoutRequestMatcher = new OrRequestMatcher(
    				new AntPathRequestMatcher(this.logoutUrl, "GET"),
    				new AntPathRequestMatcher(this.logoutUrl, "POST"),
    				new AntPathRequestMatcher(this.logoutUrl, "PUT"),
    				new AntPathRequestMatcher(this.logoutUrl, "DELETE")
    			);
    

    #自定义配置

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers("/login").permitAll()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .formLogin()
                    .loginPage("/login")
                    .defaultSuccessUrl("/").permitAll()
                    .and()
                    .logout().permitAll()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/login")
                    .clearAuthentication(true)
                    .invalidateHttpSession(true)
                    .deleteCookies("JSESSIONID")
                    .and()
                    .rememberMe()
                    .tokenValiditySeconds(60)
                    .tokenRepository(persistentTokenRepository())
                    .userDetailsService(userDetailsService)
                    .and()
                    .csrf()
                    .disable();
        }
    

    #解释

    • logout()

      登出

    • logoutUrl()

      访问地址会触发登出逻辑, 默认情况下CSRF 自动开启, 请求必须是POST , 为了方便这里采用GET方式

      实际情况要设置为POST

    • logoutSuccessUrl()

      登出成功后, 重定向地址

    • logoutSuccessHandler()

      登出成功之后的处理, 如果指定了, 那么logoutSuccessUrl就不会生效,

      需要自定义一个实现LogoutSuccessHandler的实现类。

    • addLogoutHandler()

      添加登出时的Handler,LogoutHandler 即在程序执行logout时一起参与执行其中的处理逻辑SecurityContextLogoutHandler默认会加到最后处理

      实现类:

      • PersistentTokenBasedRememberMeServices
      • TokenBasedRememberMeServices 移除Token
      • CookieClearingLogoutHandler 清楚Cookie
      • CsrfLogoutHandler 移除CSRF TOKEN
      • SecurityContextLogoutHandler
      • HeaderWriterLogoutHandler
    • clearAuthentication()

      登出后清除Authentication

    • invalidateHttpSession()

      登出后, 是否清空当前session

    • deleteCookies()

      清空指定的Cookie

    #LogoutSuccessHandler

    /**
     * 自定义登出成功处理器
     */
    @Slf4j
    public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
        @Autowired
        private ObjectMapper mapper;
        @Override
        public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
            String username = authentication.getName();
            response.setContentType("application/json;charset=utf-8");
            log.info("退出成功, 用户名{}",username);
            response.sendRedirect("/login");
        }
    }
    

    配置类添加

        @Bean
        public LogoutSuccessHandler logoutSuccessHandler(){
            return new MyLogoutSuccessHandler();
        }
    

    #参考:

    https://blog.csdn.net/mrleeyongsheng/article/details/78886184

    https://www.jianshu.com/p/a061c28d8202

  • 相关阅读:
    关于Windows程序设计的初步认识
    C++虚函数作用原理(二)——类的继承
    史诗级Java资源大全中文版
    马上加薪!测试,你的职业发展...
    你不知道的接口自动化测试!
    69道Spring面试题和答案,简单明了无套路
    大厂都在问的多线程面试题,你不了解下嘛?
    现代Java进阶之路必备技能——2019 版
    80后程序员降薪6K,预感中年危机来袭,准备跳槽却碰壁
    微服务、分布式、高并发都不懂,你拿什么去跳槽?
  • 原文地址:https://www.cnblogs.com/kikochz/p/12892932.html
Copyright © 2011-2022 走看看