SpringSecurity之注销与自动登录

前言

前面我们讲解了用户的登录以及用户授权的过程。今天我们看一下,系统中常用的注销与自动登录各功能!

注销操作

注销操作,首先需要在我们的配置类中添加上我们的注销路径。主要配置详见下方标红处代码,标记了退出的路径以及推出的handler处理类。

@Override
protected void configure(HttpSecurity http) throws Exception {
    logger.info("======================配置文件参数——enable:{},checkToken:{}",enable,checkToken);

    http.cors();
    http.exceptionHandling()
            .authenticationEntryPoint(new UnauthEntryPoint()) // 没有权限访问
            .and().csrf().disable()  // 关闭csrf的防护
            .authorizeRequests()
            .anyRequest().authenticated() //任何请求,登录后可以访问
            .and().logout().logoutUrl(loginOutUrl)//退出路径
            .addLogoutHandler(new TokenLogoutHandler(tokenManager,redisService)).and()
            .addFilter(new TokenLoginFilter(authenticationManager(), tokenManager, redisService,loginUrl,permissionSuffix))
            .addFilter(new TokenAuthFilter(authenticationManager(), tokenManager, redisService,permissionSuffix,oldTokenSuffix,refTokenSuffix,Boolean.valueOf(enable),Boolean.valueOf(checkToken),Boolean.valueOf(checkPermission))).httpBasic();
            //.and().sessionManagement().maximumSessions(1); // 设置最多允许一个人登录,后者踢掉前者
}

TokenLogoutHandler

退出Handler为我饿们清除缓存中的token信息

@Override
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
    //1 从header里面获取token
    //2 token不为空,移除token,从redis删除token
    String token = request.getHeader("token");
    if(token != null) {
        //移除
        tokenManager.removeToken(token);
        //从token获取用户名
        String username = tokenManager.getUserInfoFromToken(token,response);
        if(!StringUtils.isEmpty(username)){
            redisService.delete(username);
        }
    }
    ResponseUtil.out(response, new ApiResult());
}

记住我

SpringSecurity为我们提供的自动登录功能就是平常我们在很多网站上看到的记住我选项。

今天我们看一下基于数据库表的记住我功能。

表结构

建表语句如下:

CREATE TABLE `persistent_logins` ( `username` varchar(64) NOT NULL, `series` varchar(64) NOT NULL, `token` varchar(64) NOT NULL, `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`series`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

数据库配置文件

spring:
  application:
    name: blog-web
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
    username: root1
    password: root1

SpringSecurity配置类

 页面的记住我

记住我:
此处:name 属性值必须位 remember-me.不能改为其他值

 好了,今天关于注销及自动登录功能就先到这里。

欢迎大家点击下方卡片,关注《coder练习生》

猜你喜欢

转载自blog.csdn.net/ybb_ymm/article/details/130153891