文章目录
项目源码地址 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
则登陆后点击退出会进入到如下页面
3.2 yml里指定了signOutUrl为/nrsc-logout.html
则登陆后点击退出会进入到如下页面
3.3 清除当前用户的remember-me记录相关功能测试
- 登陆前persistent_logins表里没有任何信息
- 登陆时勾选上记住我
- persistent_logins表里多了一条用户数据
- 点击退出
- 页面显示退出成功,数据库persistent_logins表里的用户数据被删除