spring security控制session

spring security控制session
本文给你描述在spring security中如何控制http session。包括session超时、启用并发session以及其他高级安全配置。

创建session时机
我们可以准确地控制什么时机创建session,有以下选项进行控制:

always – 如果session不存在总是需要创建;
ifRequired – 仅当需要时,创建session(默认配置);
never – 框架从不创建session,但如果已经存在,会使用该session ;
stateless – Spring Security不会创建session,或使用session;

java config配置方式如下:

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

该配置仅控制spring security做什么,不是整个应用,根据配置spring security可能不创建session,但我们的应用可以创建session。理解这点很重要。

缺省值“ifRequired”,spring security根据需要创建session。

对于大多数无状态应用,“never”选项确保spring security自身不创建任何session;然而,如果应用自己创建session,那么spring security会使用它。

最后,最严格session创建选项是“stateless”,其确保应用也不会创建任何session。从spring3.1开始引入,将影响跳过部分spring security过滤器——主要与session相关的,如HttpSessionSecurityContextRepository, SessionManagementFilter, RequestCacheFilter。

这些大多数严格控制机制直接暗示cookies不被使用,每个请求需要被认证。无状态的体系结构与REST api及它们的无状态约束很好地发挥了作用。在Basic和Digest认证中也可以很好工作。

深入理解
在执行认证过程之前,spring security将运行SecurityContextPersistenceFilter过滤器负责存储安请求之间的全上下文,上下文根据策略进行存储,默认为HttpSessionSecurityContextRepository ,其使用http session作为存储器。

对于严格的创建session选项“stateless”,使用另一个存储策略—— NullSecurityContextRepository,没有session被创建或使用,用于保存上下文。

并发session控制
当已经认证过的用户尝试再次认证时,应用针对该事件有几种处理方式。可以注销当前用户session,使用新的session重新认证,或允许两个session并存。
启用并发session控制,首先需要在配置中增加下面监听器:

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

其本质是确保当session被销毁时,通知spring security session注册器。
在这种场景下,允许同一用户拥有多个并发session,配置如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement().maximumSessions(2)
}

session超时
session已经超时后,如果用户使用已经过期的sessionid发送请求,则会被重定向至指定url;同样如果使用未过期但完全无效的sessionid用户发送请求,也会被重定向至特定url,配置如下:

http.sessionManagement()
.expiredUrl("/sessionExpired.html")
.invalidSessionUrl("/invalidSession.html");

防止使用url参数进行session跟踪
在url中暴露session信息会增加安全风险,自spring3.0开始,追加jsessionId至url的重新逻辑可以被禁用,通过设置disable-url-rewriting=”true” 。另外自servlet3.0开始,session跟踪机制也可以在web.xml中配置:

<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>

javaConfig方式配置如下:

servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE));

配置可以设置jessionId存储位置:cookie或url参数。

spring security防止篡改session
框架提供了保护典型的session篡改攻击,当用户尝试再次认证时,已经存在的session可以配置实现以不同方式处理。配置方式如下:

http.sessionManagement()
.sessionFixation().migrateSession()

缺省情况,spring security启用migrateSession,即认证时,创建一个新http session,原session失效,属性从原session中拷贝过来。

如果不期望这种行为,还有其他两个选项:

“none”,原session保持有效;
“newSession”,新创建session,且不从原session中拷贝任何属性。
使用session
session范围bean
bean可以简单地通过@Scope在web上下文中定义session范围:

@Component
@Scope("session")
public class Foo { .. }

然后,可以再注入值另一个bean:

@Autowired
private Foo theFoo;

这时,spring会在http session范围内创建一个新的bean。

在Controller中注入原生session
原生的session可以被直接注入至Controller方法:

@RequestMapping(..)
public void fooMethod(HttpSession session) {
session.addAttribute(Constants.FOO, new Foo();
//...
Foo foo = (Foo) session.getAttribute(Constants.Foo);
}

获取原生session
也可以通过调用servlet api以编程方式获取当前http session:

ServletRequestAttributes attr = (ServletRequestAttributes)
RequestContextHolder.currentRequestAttributes();
HttpSession session= attr.getRequest().getSession(true); // true == allow create

总结
本文讨论了spring security如何管理session,以及如何使用session。
————————————————
版权声明:本文为CSDN博主「neweastsun」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/neweastsun/article/details/79371175

原文地址:https://www.cnblogs.com/renjiaqi/p/11634606.html

时间: 2024-09-27 19:48:00

spring security控制session的相关文章

Spring Security控制权限

Spring Security控制权限 1,配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了. <filter>    <filter-name>springSecurityFilterChain</filter-name>    <filter-class>org.springframework.web.filter.DelegatingFilterProxy&

spring security 控制用户信息用户加密 缓存用户信息

1. MD5加密 任何一个正式的企业应用中,都不会在数据库中使用明文来保存密码的,我们在之前的章节中都是为了方便起见没有对数据库中的用户密码进行加密,这在实际应用中是极为幼稚的做法.可以想象一下,只要有人进入数据库就可以看到所有人的密码,这是一件多么恐怖的事情,为此我们至少要对密码进行加密,这样即使数据库被攻破,也可以保证用户密码的安全. 最常用的方法是使用MD5算法对密码进行摘要加密,这是一种单项加密手段,无法通过加密后的结果反推回原来的密码明文. 首先我们要把数据库中原来保存的密码使用MD5

Spring Security入门(3-8)Spring Security获取session中的UserDetail

[Java][Spring][scurity]同步session控制,防止一个用户多次登录

[Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1.你须要把以下的监听器加入到你的web.xml文件中,让Spring Security获得session生存周期事件: <listener> <listener-class> org.springframework.security.ui.session.HttpSessionEvent

Spring Security 入门(1-13)Spring Security - Session管理

session 管理 Spring Security 通过 http 元素下的子元素 session-management 提供了对 Http Session 管理的支持. 检测 session 超时 Spring Security 可以在用户使用已经超时的 sessionId 进行请求时将用户引导到指定的页面.这个可以通过如下配置来实现. <security:http> ... <!-- session 管理,invalid-session-url 指定使用已经超时的 sessionI

Spring Security教程之session管理(十一)

1.1     检测session超时 1.2     concurrency-control 1.3     session 固定攻击保护 Spring Security通过http元素下的子元素session-management提供了对Http Session管理的支持. 1.1     检测session超时 Spring Security可以在用户使用已经超时的sessionId进行请求时将用户引导到指定的页面.这个可以通过如下配置来实现. <security:http> ... &

Spring Security学习总结

1.Spring Security介绍  一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分. 用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户认证一般要求用户提供用户名和密码.系统通过校验用户名和密码来完成认证过程. 用户授权指的是验证某个用户是否有权限执行某个操作.在一个系统中,不同用户所具有的权限是不同的.比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改.一般来说,系统

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈开发企业级认证与授权网盘地址:https://pan.baidu.com/s/1mj8u6JQ 密码: 92rp备用地址(腾讯微云):https://share.weiyun.com/8b2ffc1839069b4399950333860754a4 密码:a539tn 第1章 课程导学介绍课程内容.课程特点,使用的主要技术栈,以及学习课程所需的前置知识 第2章 开始开发安装开发工具,介绍项目代码结构并搭建,基本的依赖和参数设置,开发hello world 第3

Spring Security教程系列(一)基础篇

第 1 章 一个简单的HelloWorld 第 1 章 一个简单的HelloWorld Spring Security中可以使用Acegi-1.x时代的普通配置方式,也可以使用从2.0时代才出现的命名空间配置方式,实际上这两者实现的功能是完全一致的,只是新的命名空间配置方式可以把原来需要几百行的配置压缩成短短的几十行.我们的教程中都会使用命名空间的方式进行配置,凡事务求最简. 1.1. 配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我