spring boot整合 spring security之会话管理

Posted 健康平安的活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot整合 spring security之会话管理相关的知识,希望对你有一定的参考价值。

一 会话

1.1 做会话原因

用户认证通过后,为了避免用 户的每次操作都进行认证可将用户的信息保存在会话中

1.2 实现会话的原理

1.spring security 提供会话管 理,认证通过后将身份信息放 入SecurityContextHolder 上下文, SecurityContext与当前线程进行绑定,方便获取 用户身份。
2.Spring Security获取当前登录用户信息的方法为:
SecurityContextHolder.getContext().getAuthentication()

二 案例操作

本案例操作是在上一篇工程的基础上进行操作。

2.1 获取当前登录用户的信息

在controller中进行获取

  //获取当前用户信息
    private String getCurrentOnlineUsername(){
        String username = null;
        //当前认证通过的用户身份
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        //用户身份
        Object principal = authentication.getPrincipal();
        if(principal == null){
            username = "匿名";
        }
        if(principal instanceof UserDetails){
            UserDetails userDetails = (UserDetails) principal;
            username = userDetails.getUsername();
        }else{
            username = principal.toString();
        }
        return username;
    }

2.2 在访问资源的方法上获取登录用户

还是在controller上,针对获取资源的方法上,获取当前登录的用户信息,进行逻辑判断,如

loginSuccess()、r1、r2方法上

 2.3  设置每个登录成功用户设置一个session

默认情况下,Spring Security会为每个登录成功的用户会新建一个Session,就是ifRequired
通过以下配置方式对该选项进行配置:



@Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) 

}

 2.4  测试

2.4.1 未登录前,访问资源

跳转到登录页面

2.4.2 未登录成功后,访问资源

 #现在刷新网址:

2.5  session超时的处理

可以再 sevlet 容器中设置 Session 的超时时间,如下设置 Session 有效期为 3600s
server.servlet.session.timeout = 3600s
1.在配置文件进行设置

 2.在Spring Security 配置文件中设置跳转的路径

 3.controller

4.测试

1.登录

 

访问资源

 一分钟后再次刷新:

 

 2.6  cookie会话设置

我们可以使用 httpOnly secure 标签来保护我们的会话 cookie
httpOnly :如果为 true ,那么浏览器脚本将无法访问 cookie
secure :如果为 true ,则 cookie 将仅通过 HTTPS 连接发送
spring boot 配置文件:
server.servlet.session.cookie.http‐only = true
server.servlet.session.cookie.secure = true


  2.7  会话控制

我们需要准确控制会话何时创建以及 Spring Security 如何与之交互:

 1.在spring security config配置文件,通过以下配置方式对该选项进行配置:

@Override
protected void configure ( HttpSecurity http ) throws Exception {
http . sessionManagement ()
. sessionCreationPolicy ( SessionCreationPolicy . IF_REQUIRED )
}

 

默认情况下,Spring Security会为每个登录成功的用户会新建一个Session,就是ifRequired
若选用 never ,则指示 Spring Security 对登录成功的用户不创建 Session 了,但若你的应用程序在某地方新建了 session,那么 Spring Security 会用它的。
若使用 stateless ,则说明 Spring Security 对登录成功的用户不会创建 Session 了,你的应用程序也不会允许新建 session。并且它会暗示不使用 cookie ,所以每个请求都需要重新进行身份验证。这种无状态架构适用于 REST API 及其无状态认证机制

 

以上是关于spring boot整合 spring security之会话管理的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot如何整合Redis

Spring Boot如何整合Redis

Spring Boot:Spring Boot整合FreeMarker

spring boot 系列之四:spring boot 整合JPA

Spring Boot系列Spring Boot整合持久层

Spring Boot 2.X - Spring Boot整合AMQP之RabbitMQ