1:首先创建一张表
为什么是这张表,可以点开JdbcTokenRepositoryImpl看
sql:CREATE TABLE
persistent_logins(
usernamevarchar(64) NOT NULL,
seriesvarchar(64) NOT NULL,
tokenvarchar(64) NOT NULL,
last_usedtimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (
series) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
在springsecurity的配置类中配置
// 是sql下 的DataSource,表示applicantion.yml中配置的数据源
import javax.sql.DataSource;
/**
* @Description: 记住我持久化到数据库中
* @author libiao
* @Date 2020-6-22 9:50
* @Param
* @return
**/
@Bean
public PersistentTokenRepository persistentTokenRepository(){
JdbcTokenRepositoryImpl repository = new JdbcTokenRepositoryImpl();
repository.setDataSource(dataSource);
return repository;
}
还需要告诉springsecurity
// 开启记住我,60秒
http.rememberMe().rememberMeParameter("rememberMe").tokenValiditySeconds(60)
.tokenRepository(persistentTokenRepository()).userDetailsService(userDetailsService);
2:logout
logout的默认行为
- 当前session失效,即:logout的核心需求,session失效就是访问权限的回收
- 删除当前用户的remember-me“记住我”的功能信息
- clear 清除当前的SecurityContext
- 重定向到登陆页面,loginPage配置的页面// 如果有配置登出成功后的页面,那么就跳转到指定的页面(http.logout().logoutSuccessUrl("/");)
logout也有成功后执行handler
在自定义的这个handler中可以实现一些登出的逻辑,比如记录登陆的时间等
编码:
首先实现LogoutSuccessHandler
package com.libiao.basicserver.config.auth;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
@Override
public void onLogoutSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException, ServletException {
//具体的业务逻辑,比如:登录时间的统计
// 重定向的页面
response.sendRedirect("/");
}
}
然后在springsecurity的配置类中配置这个handler
// 开启注销
http.logout()
//.logoutSuccessUrl("/")
.logoutSuccessHandler(myLogoutSuccessHandler);