spring-security退出登陆

文章目录

  • 1 spring-security默认退出处理逻辑
  • 2 自定义退出登陆的一些处理逻辑
  • 3 测试
    • 3.1 yml未指定signOutUrl
    • 3.2 yml里指定了signOutUrl为/nrsc-logout.html
    • 3.3 清除当前用户的remember-me记录相关功能测试

项目源码地址 https://github.com/nieandsun/security

1 spring-security默认退出处理逻辑

Spring Security的退出登陆功能由LogoutFilter过滤器拦截处理,默认的退出登陆url为 /logout。

在退出登陆时会做如下几件事:

  • 使当前session失效
  • 清除当前用户的remember-me记录
  • 清空当前的SecurityContext
  • 重定向到登录界面

2 自定义退出登陆的一些处理逻辑

在配置文件里自定义退出登陆的一些处理逻辑

.and()
   //退出登陆相关的逻辑
   .logout()
   //自定义退出的url---默认的为/logout
   .logoutUrl("/signOut")
   //自定义退出成功处理器
   .logoutSuccessHandler(logoutSuccessHandler)
   //自定义退出成功后跳转的url与logoutSuccessHandler互斥
   //.logoutSuccessUrl("/index")
   //指定退出成功后删除的cookie
   .deleteCookies("JSESSIONID")

不要忘记对涉及到的URL进行授权

//配置不用进行认证校验的url
.antMatchers(
   SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,
   SecurityConstants.DEFAULT_LOGIN_PROCESSING_URL_MOBILE,
   nrscSecurityProperties.getBrowser().getLoginPage(),
   SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/*",
   nrscSecurityProperties.getBrowser().getSignUpUrl(),
   //session失效默认的跳转地址
   nrscSecurityProperties.getBrowser().getSession().getSessionInvalidUrl(),
   //获取第三方账号的用户信息的默认url
   SecurityConstants.DEFAULT_GET_SOCIAL_USERINFO_URL,
   //退出登陆默认跳转的url
   nrscSecurityProperties.getBrowser().getSignOutUrl(),
   "/user/register",
   "/js/**"
)
.permitAll()

自定义的退出成功处理器

package com.nrsc.security.browser.logout;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.nrsc.security.utils.ResultVOUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import java.io.IOException;

/**
 * @author : Sun Chuan
 * @date : 2019/9/22 12:00
 * Description:退出成功处理器
 */
@Slf4j
public class NRSCLogoutSuccessHandler implements LogoutSuccessHandler {
    /**
     * 退出登陆url
     *      可以在yml或properties文件里通过nrsc.security.browser.signOutUrl 进行指定
     *      我指定的默认值为"/" --- 因为如果不指定一个默认的url时,配置授权那一块会报错
     */
    private String signOutSuccessUrl;
    private ObjectMapper objectMapper = new ObjectMapper();
    public NRSCLogoutSuccessHandler(String signOutSuccessUrl) {
        this.signOutSuccessUrl = signOutSuccessUrl;
    }

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {

        log.info("退出成功");
        //如果没有指定退出成功的页面则返回前端一个json字符串
        if (StringUtils.equalsIgnoreCase("/",signOutSuccessUrl)) {
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(objectMapper.writeValueAsString(ResultVOUtil.success("退出成功")));
        } else {
            //重定向到退出成功登陆页面
            response.sendRedirect(signOutSuccessUrl);
        }
    }
}

3 测试

3.1 yml未指定signOutUrl

则登陆后点击退出会进入到如下页面
spring-security退出登陆_第1张图片

3.2 yml里指定了signOutUrl为/nrsc-logout.html

则登陆后点击退出会进入到如下页面
spring-security退出登陆_第2张图片

3.3 清除当前用户的remember-me记录相关功能测试

  • 登陆前persistent_logins表里没有任何信息

在这里插入图片描述

  • 登陆时勾选上记住我

spring-security退出登陆_第3张图片

  • persistent_logins表里多了一条用户数据

spring-security退出登陆_第4张图片

  • 点击退出

spring-security退出登陆_第5张图片

  • 页面显示退出成功,数据库persistent_logins表里的用户数据被删除

spring-security退出登陆_第6张图片

你可能感兴趣的:(spring-security,spring-security)