spring security session管理

摘要:
独立会话管理:此演示基于spring boot 2.0.1版本。Spring安全性提供了良好的会话配置管理。它包括相应的处理配置,如会话无效处理、会话并发控制、会话过期等。此配置为1。当用户在不同的浏览器或不同的计算机上重复登录时,系统将自动退出先前的登录会话。此时,会话将进入过期处理策略。MaxSessionPreventsLogin:当同时登录的最大会话数达到maximumSessions配置时,将拒绝使用相同帐户的后续登录,将抛出消息:Maximumsessionsf1 for the principal exceeded expiredSessionStrategy:会话过期处理策略需要实现SessionInformation ExpiredStrategy接口,默认实现为SimpleRedirectSessionInformation Expire Strategy。确定启用Redis的会话管理策略。

单机 Session 管理:

  本文Demo 基于 springboot 2.0.1版本.

  spring security 中提供了很好的 session 配置管理。包括session 无效处理、session 并发控制、session过期等相应处理配置。

  在 Security 的配置中我们重写了 protected void configure(HttpSecurity http) 方法,在里面可以可以通过以下配置来达到以上描述的 Session 相关配置。

http.sessionManagement()
// .invalidSessionUrl("http://localhost:8080/#/login")
  .invalidSessionStrategy(invalidSessionStrategy)//session无效处理策略
  .maximumSessions(1) //允许最大的session
// .maxSessionsPreventsLogin(true) //只允许一个地点登录,再次登陆报错
  .expiredSessionStrategy(sessionInformationExpiredStrategy) //session过期处理策略,被顶号了
;

  invalidSessionUrl : 配置当 session 无效的时候的跳转地址,我们可以配置成当前系统的登录页即可。

  invalidSessionStrategy:配置 session 无效时的处理策略,需要实现 InvalidSessionStrategy 接口,重写对应方法,默认为 SimpleRedirectInvalidSessionStrategy ,可以参考这个类来写我们的实现。这里就写的简单点如下:

public class WuzzInvalidSessionStrategy implements InvalidSessionStrategy {

    @Override
    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String message = "session已失效";
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(JSON.toJSONString(message));
    }
}

  maximumSessions : 配置允许同时登陆的最大session数。这里配置成 1,当用户在不同浏览器,或者不同机器下重复登陆后,系统会自动将前一次登录的 session 踢出,此时session 将会进入过期处理策略。

  maxSessionsPreventsLogin : 当同时登陆的最大sseion 数达到 maximumSessions 配置后,拒绝后续同账户登录,抛出信息 :Maximum sessions of 1 for this principal exceeded

  expiredSessionStrategy : session过期处理策略 ,需要实现 SessionInformationExpiredStrategy 接口,默认实现 SimpleRedirectSessionInformationExpiredStrategy。这里简单做一下实现:

public class WuzzExpiredSessionStrategy implements SessionInformationExpiredStrategy {

    /* (non-Javadoc)
     * @see org.springframework.security.web.session.SessionInformationExpiredStrategy#onExpiredSessionDetected(org.springframework.security.web.session.SessionInformationExpiredEvent)
     */
    @Override
    public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
        String message = "session过期处理。";

        event.getResponse().setStatus(HttpStatus.UNAUTHORIZED.value());
        event.getResponse().setContentType("application/json;charset=UTF-8");
        event.getResponse().getWriter().write(JSON.toJSONString(message));
    }
}

集群 Session 管理:

  session 存储策略配置,security 给我们提供了一个参数配置 session 存储策略类型 spring.session.store-type = REDIS,可配置类型由 org.springframework.boot.autoconfigure.session.StoreType 类决定。REDIS,MONGODB,JDBC,HAZELCAST,NONE

  重点说一下Redis backed sessions:要实现 redis +security整合,步骤如下:

1.导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

2.修改配置项:

spring.session.store-type = REDIS
# Redis服务地址
spring.redis.host=192.168.1.101
# Redis服务端口
spring.redis.port=6379
# Redis 连接密码
spring.redis.password=wuzhenzhao

3.启动类配置上注解   @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)。标识启用Redis 的session管理策略。

4.验证,此时将项目分别在 8080、8081两个端口上启动。在 8080 端口的服务上做登录,将会在 redis上看到类似一下信息:

spring security session管理第1张

   登陆成功后直接访问 8081 受保护的资源,结果发现无需重复登陆。

免责声明:文章转载自《spring security session管理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NX二次开发-UFUN体找面函数UF_MODL_ask_body_facesC# Winform 涉及的拖放操作总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SpringBoot入门-Redis(六)

依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId>...

Java自动化 接口测试Cookie与token

一、Cookie与token机制测试   Cookie与Session token机制 cookie/session机制需要在服务端保存大量的session信息,造成严重负担,而token机制则避免记录大量信息,采用服务器签发的token完成验证。 1、客户端使用用户名跟密码请求登录 2、服务端收到请求,去验证用户名与密码 3、验证成功后,服务...

redis开机自动启动服务

一、首先是下载Redis(这里我选择64位)github下载地址:https://github.com/MicrosoftArchive/redis/releases 二、解压压缩包,进入安装目录在空白处按下shift+鼠标右键,打开命令窗口。 三、输入命令执行:redis-server --service-install redis.windows.co...

redis-删除所有key

删除所有Key,可以使用Redis的flushdb和flushall命令 //删除当前数据库中的所有Key flushdb //删除所有数据库中的key flushall 如果要访问 Redis 中特定的数据库,使用下面的命令 //下面的命令指定数据序号为0,即默认数据库 redis-cli -n 0 keys "*" | xargs redis-cli...

基于Redis实现延时队列服务

背景 在业务发展过程中,会出现一些需要延时处理的场景,比如: a.订单下单之后超过30分钟用户未支付,需要取消订单b.订单一些评论,如果48h用户未对商家评论,系统会自动产生一条默认评论c.点我达订单下单后,超过一定时间订单未派出,需要超时取消订单等。。。处理这类需求,比较直接简单的方式就是定时任务轮训扫表。这种处理方式在数据量不大的场景下是完全没问题,但...

QTA-qtaf自动化测试实践

背景: 项目leader认为万物皆可自动化,然后就拍脑袋要搞个自动化,后面搞不下去了,凉了。虽然说项目凉了,但是过程中收获满满,所以脱敏后就有了这篇博客:https://www.cnblogs.com/Klay/p/15339223.html 需求: 需要把自动化做成一个服务,提供给后台调用 对测试进度量化,如:测试进度的百分比 测试报告定制化,如:展...