SpringSecurity-10-Session会话管理

简介: SpringSecurity-10-Session会话管理

SpringSecurity-10-Session会话管理

理解Session


Http协议是一种无状态协议所以当服务端需要记录用户的状态时,需要某种机制用于识别用户,这个机制就是Session。服务器通过和用户约定每一个请求携带一个id信息,用于统一用户的请求有了管理,并且区分不同用户。基于session方案,为让用户请求都携带同一个id,并且不妨碍用户体验的情况下,选择cookie作为载体是一个不错的选择,用户第一次访问服务器的时候,没有携带id,服务器端会生成sessionid:session键值对,并且发送sessionid给客户端添加到cookie中。然后该用户在之后的访问中,每一次请求都会将sessionid放到cookie中,使得服务端可以很容易识别用户。


但是有时候用户为了保护个人信息或者安全考虑会禁用cookie,这时候cookie就无法使用。因此有时候服务还支持用url重写来实现,比如:

http://www.baidu.com;jessionid=xxx


URL重写原本是为了兼容禁用cookie的浏览器而设计的,但也容易被黑客利用。黑客只需访问一 次系统,将系统生成的sessionId提取并拼凑在URL上,然后将该URL发给一些取得信任的用户。只要 用户在session有效期内通过此URL进行登录,该sessionId就会绑定到用户的身份,黑客便可以轻松享 有同样的会话状态,完全不需要用户名和密码,这就是典型的会话固定攻击。



0997c4e8da6a86b0e74d976cc67e0278.png


防御会话固定攻击


sessionManagement是一个会话管理的配置器,其中,防御会话固定攻击的策略有四种:


none:用户登录后session不发生变化


newSession:用户登录以后创建新的session


migrateSession:用户登录后创建新的session,但是会将旧的session中数据复制到新的session中。


changeSessionId:不创建新的会话,而是使用selert容器提供的会话固定保护,每次登录访问之后都更换sessionid,但是没有新建session会话。默认启动此策略


 http.sessionManagement().sessionFixation().changeSessionId();

会话过期


除了防御会话固定攻击,还可以通过SpringSecurity配置会话过期策略,比如会话过期跳转到某个URL。在Springboot应用中有两种会话超时设置的方式,当会话超时之后用户需要重写登录才可以访问应用:


server.servlet.session.timeout=1m


spring.session.timeout=1m


方式1是springboot应用自带的session超时设置,方式2是使用Spring Session之后。提供的session超时配置,方式2优先级高。


在Spring Boot中Session超时最短的时间是一分钟,当你的设置小于一分钟的时候,默认为一分钟默认超时时长是30分钟


默认情况下session失效以后会跳转到认证页面,我们可以自定义session失效后,响应结果,有以下两种方式。


invalidSessionUrl


invalidSessionUrl作用是session失效后跳转的url,配置如下,在安全配置中心的 configure(HttpSecurity http)方法中添加代码如下:


在src\main\resources\templates路径下添加invalidSession.html

<!--suppress ALL-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>springboot葵花宝典登录页面</title>
    <!-- Tell the browser to be responsive to screen width -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>springboot葵花宝典登录页面</h1>
<h2>session会话失效</h2>
</body>
</html>


  1. 在controller中添加
    @RequestMapping("/invalidSession")
    public String invalidSession() {
        return "invalidSession"; // classpath: /templates/login.html
    }


  1. 在LearnSrpingSecurity的configure(HttpSecurity http)添加配置
在LearnSrpingSecurity的configure(HttpSecurity http)添加配置
http.s


具体配置如图

注意要以上路径需要配置permitAll()权限,即无需授权即可访问

测试


启动项目登录后,再次登录,结果如下

invalidSessionStrategy


session失败后的策略,配置如下:

  1. 创建com.security.learn.sessionStrategy.CustomInvalidSessionStrategy代码如下
public class CustomInvalidSessionStrategy implements InvalidSessionStrategy {
    private  static ObjectMapper objectMapper = new ObjectMapper();
    @Override
    public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        Cookie cookie = new Cookie("JSESSIONID", null);
        cookie.setMaxAge(0);
        String contextPath = request.getContextPath();
        String c= contextPath.length() > 0 ? contextPath : "/";
        cookie.setPath(c);
        response.addCookie(cookie);
        // 当认证失败后,响应 JSON 数据给前端
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(objectMapper.writeValueAsString("策略失效"));
    }
}


  1. 将CustomInvalidSessionStrategy注入容器
@Configuration
public class Myconfig {
    @Bean
    @ConditionalOnMissingBean(InvalidSessionStrategy.class)
    public CustomInvalidSessionStrategy customInvalidSessionStrategy(){
        return  new CustomInvalidSessionStrategy();
    }
}


  1. 添加session失效处理

在LearnSrpingSecurity的configure(HttpSecurity http)添加配置,代码如下

测试


启动项目登录后,再次登录,结果如下

如果您觉得本文不错,欢迎关注,点赞,收藏支持,您的关注是我坚持的动力!


目录
相关文章
|
6月前
|
人工智能 JSON 安全
Spring Boot实现无感刷新Token机制
本文深入解析在Spring Boot项目中实现JWT无感刷新Token的机制,涵盖双Token策略、Refresh Token安全性及具体示例代码,帮助开发者提升用户体验与系统安全性。
651 4
|
8月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
981 2
|
5月前
|
监控 安全 NoSQL
【SpringBoot】OAuth 2.0 授权码模式 + JWT 令牌自动续签 的终极落地指南,包含 深度技术细节、生产环境配置、安全加固方案 和 全链路监控
【SpringBoot】OAuth 2.0 授权码模式 + JWT 令牌自动续签 的终极落地指南,包含 深度技术细节、生产环境配置、安全加固方案 和 全链路监控
2121 1
|
8月前
|
安全 Java 数据安全/隐私保护
Spring Security: 深入解析 AuthenticationSuccessHandler
本文深入解析了 Spring Security 中的 `AuthenticationSuccessHandler` 接口,它用于处理用户认证成功后的逻辑。通过实现该接口,开发者可自定义页面跳转、日志记录等功能。文章详细讲解了接口方法参数及使用场景,并提供了一个根据用户角色动态跳转页面的示例。结合 Spring Security 配置,展示了如何注册自定义的成功处理器,帮助开发者灵活应对认证后的多样化需求。
282 2
|
SQL JSON 安全
Spring Authorization Server OAuth2授权服务器配置详解
Spring Authorization Server OAuth2授权服务器配置详解
3987 0
|
7月前
|
Java
SpringBoot快速搭建WebSocket服务端和客户端
由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。
2183 1
|
XML 安全 Java
掌握SpringBoot单点登录精髓,一键通行多系统,轻松打造无缝用户体验新纪元!
【8月更文挑战第29天】单点登录(SSO)是一种身份认证机制,用户在多个相互信任的应用系统中只需登录一次即可访问所有系统,无需重复输入凭证。本文详细介绍如何利用Spring Security和OAuth2在SpringBoot中实现SSO,并提供示例代码。核心步骤包括:引入依赖、配置认证服务器与资源服务器、实现单点登录拦截器及完成SSO配置。通过合理配置,SSO能显著提升用户体验和系统安全性。
892 2
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
2534 2
|
安全 Java 数据库
Spring Security详细讲解(JWT+SpringSecurity登入案例)
通过本篇博文,你可以详细了解Spring Security的相关概念与原理,并且掌握Spring Security的认证与授权,通过博文中的登入案例可以让自己定制去Spring Security认证授权方案。
Spring Security详细讲解(JWT+SpringSecurity登入案例)
|
前端开发 安全 Java
Spring Security--获取登录成功的用户信息
这里讲的是securiy处理用户信息的方法。 首先,服务端一定是讲用户信息存到Httpsession中。
477 1

热门文章

最新文章