美文网首页Spring Security
Spring Security源码分析九:Spring Secu

Spring Security源码分析九:Spring Secu

作者: 淡淡的伤你 | 来源:发表于2018-01-19 17:00 被阅读196次

    Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

    Session管理

    本文主要描述在 Spring SecuritySession的以下三种管理,

    1. Session超时时间
    2. Session的并发策略
    3. 集群环境Session处理

    Session超时

    1. application.yml配置超时时间
    server:
      port: 80
      session:
        timeout: 60
    
    1. 配置MerryyouSecurityConfig
    http.
    ......
               .sessionManagement()
                .invalidSessionUrl("/session/invalid")//session失效跳转的链接
    .....
    
    1. Cotroller/session/invalid
    @GetMapping("/session/invalid")
        @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
        public Result<String> sessionInvalid() {
            return ResultUtil.error(HttpStatus.UNAUTHORIZED.value(), "session失效");
        }
    

    效果如下:

    https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/security/Spring-Security-sessionTimeout.gif

    Session的并发策略

    1. 配置MerryyouSecurityConfig
    http.
    ......
               .maximumSessions(1)//最大session并发数量1
               .maxSessionsPreventsLogin(false)//false之后登录踢掉之前登录,true则不允许之后登录
               .expiredSessionStrategy(new MerryyounExpiredSessionStrategy())//登录被踢掉时的自定义操作
    .....
    
    1. MerryyounExpiredSessionStrategy
    @Slf4j
    public class MerryyounExpiredSessionStrategy implements SessionInformationExpiredStrategy {
        @Override
        public void onExpiredSessionDetected(SessionInformationExpiredEvent eventØ) throws IOException, ServletException {
            eventØ.getResponse().setContentType("application/json;charset=UTF-8");
            eventØ.getResponse().getWriter().write("并发登录!");
        }
    }
    

    效果如下:

    https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/security/Spring-Security-session01.gif

    maxSessionsPreventsLogin(true)可参考:Spring-Securitysecurity-oauth2

    集群环境Session处理

    1. 添加spring-session-data-redis依赖
    <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
                <version>1.3.1.RELEASE</version>
            </dependency>
    
    1. 配置Spring-session存储策略
    spring:
      redis:
        host: localhost
        port: 6379
      session:
        store-type: redis
    
    1. 测试80808081端口分别启动项目
    java -jar spring-security.jar --server.port=8080
    java -jar spring-security.jar --server.port=8081
    

    效果如下:

    https://raw.githubusercontent.com/longfeizheng/longfeizheng.github.io/master/images/security/Spring-Security-session02.gif

    关于更多Spring Session可参考:程序猿DD

    代码下载

    从我的 github 中下载,https://github.com/longfeizheng/logback

    相关文章

      网友评论

      • 编程界的小学生:通用的权限处理框架,基于Spring-Security的二次封装,可扩展,可配置。即使不想用的话也可以学习学习这种封装可扩展可配置框架的思想。
        包含了前后分离处理方案(JWT+Redis),前后不分离处理方案(session),validate验证部分处理。
        https://gitee.com/geekerdream/common-security
        给个star吧,不容易的。

      本文标题:Spring Security源码分析九:Spring Secu

      本文链接:https://www.haomeiwen.com/subject/kiqaoxtx.html