springboot+springsecurity session配置管理

简介: 在实际的使用过程中,用户会话的有效期以及管理也是很重要的部分。不同需求管理方式也不一样。本文就是根据我在项目中的使用而总结的经验,可能并不全面,但会以最直接的方式展示,也方便快速上手。同时也展示出前后端分离前后的配置,差别仅是路径和拦截而已。

一、前述

首先,介绍几种场景,读者可对号入座。
1)、默认登录的会话到期后直接跳转到登录页,再次登录后进行操作。
2)、同一账户限制同时登录用户数量,达到后踢掉之前登录的用户
3)、同一账户限制同时登录用户数量,达到不允许新的用户登录

二、场景

2.1、默认会话到期处理

一般情况下,在用户无任何操作30分钟后会话会默认到期。此时,则需要用户重新登录才可以进行相应操作。

.sessionManagement()//session到期提示
    .invalidSessionUrl("/login")//分离前通过此配置跳转登录页进行登录
    .invalidSessionStrategy(mMyAuthenctiationInvalidSessionStrategy)//session到期拦截并返回相应信息

上述代码中拦截处理部分mMyAuthenctiationInvalidSessionStrategy的代码:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.web.session.InvalidSessionStrategy;
import org.springframework.stereotype.Component;

import net.cnki.common.msgreturn.ResultCode;
import net.cnki.common.msgreturn.ResultGenerator;


/**
 * session到期
 * @author ZhiPengyu
 *
 */
@Component
public class MyAuthenctiationInvalidSessionStrategy implements InvalidSessionStrategy{
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    ResultGenerator resultGenerator;
    
    @Override
    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        logger.info("session到期!");
        
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(resultGenerator.getFreeResult(ResultCode.SESSION_EXPIRES).toString());
        
    }
    

}

2.2、达到会话限制数量踢掉之前登陆用户

此时分离前后都一样的配置。但是需要注意实现的接口SessionInformationExpiredStrategy,与到期不同。

http.sessionManagement().maximumSessions(1).expiredSessionStrategy(myAuthenctiationSessionStrategy);//会话管理:用户仅允许一个登陆,踢出旧的登录

上面配置完session之后,下边是实现接口拦截。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.web.session.SessionInformationExpiredEvent;
import org.springframework.security.web.session.SessionInformationExpiredStrategy;
import org.springframework.stereotype.Component;

import net.cnki.common.msgreturn.ResultCode;
import net.cnki.common.msgreturn.ResultGenerator;

/**
 * 已被其他用户登录
 * @author ZhiPengyu
 *
 */
@Component
public class MyAuthenctiationSessionInformationExpiredStrategy implements SessionInformationExpiredStrategy{
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    ResultGenerator resultGenerator;
    
    @Override
    public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
        // TODO Auto-generated method stub
        logger.info("已被其他用户登录!");
        
        HttpServletResponse response = event.getResponse();
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().print(resultGenerator.getFreeResult(ResultCode.SESSION_EXPIRES_OTHER_LOGIN).toString());
        response.flushBuffer();    
    }

}

2.3、达到会话限制数量不允许新用户登陆

此处则不需要拦截,会返回对应的状态以及信息。但是值得注意的是,需要将HttpSessionEventPublisher加入spring容器中。否则会出现当以登录的用户退出后在登陆也会被阻止的情况。此处需要讲到源码的实现,不多解释,简单说是因为监听不在容器,所以监听不到容器中的session状态。

http.sessionManagement().maximumSessions(1).maxSessionsPreventsLogin(true);//只允许一个登陆,不允许新的登录

同时在WebSecurityConfig配置类中添加如下即可:(springboot利用@Configuration注解在配置类加@Bean不多说了)

@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
    return new HttpSessionEventPublisher();
}

当新用户登陆时,会返回401,并提示已经达到最大值。登录失败

{
"code": "401",
"message": "Maximum sessions of 1 for this principal exceeded"
}

三、总结

session的情况多种多样,security的功能还是很强大的,我所遇到的情况也并不多。

相关文章
|
存储 安全 Java
SpringBoot搭建Spring Security 入门
SpringBoot搭建Spring Security 入门
384 0
|
存储 安全 Java
Spring Boot整合Spring Security--学习笔记
Spring Boot整合Spring Security--学习笔记
211 1
|
缓存 前端开发 Java
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
【二十八】springboot之通过threadLocal+参数解析器实现同session一样保存当前登录信息的功能
289 1
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
147 0
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
966 0
|
7月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
162 0
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
1555 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
396 0
|
12月前
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
1115 3
springboot整合springsecurity,从数据库中认证
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
1097 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header