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
spring security控制session的更多相关文章
- Spring Security控制权限
Spring Security控制权限 1,配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了. < ...
- 使用Spring Security控制会话
1.概述 在本文中,我们将说明Spring Security如何允许我们控制HTTP会话.此控件的范围从会话超时到启用并发会话和其他高级安全配置. 2.会话何时创建? 我们可以准确控制会话何时创建以及 ...
- Spring Security 之Session管理配置
废话不多说,直接上代码.示例如下: 1. 新建Maven项目 session 2. pom.xml <project xmlns="http://maven.apache.o ...
- Spring Security 梳理 - session
Spring Security默认的行为是每个登录成功的用户会新建一个Session.这也就是下面的配置的效果: <http create-session="ifRequired&qu ...
- spring security 控制用户信息用户加密 缓存用户信息
1. MD5加密 任何一个正式的企业应用中,都不会在数据库中使用明文来保存密码的,我们在之前的章节中都是为了方便起见没有对数据库中的用户密码进行加密,这在实际应用中是极为幼稚的做法.可以想象一下,只要 ...
- Spring Security入门(3-8)Spring Security获取session中的UserDetail
- Spring Security(13)——session管理
1.1 检测session超时 1.2 concurrency-control 1.3 session 固定攻击保护 Spring Security通过http元素下的子元素s ...
- Spring Security 入门(1-7)Spring Security - Session管理
参考链接:https://xueliang.org/article/detail/20170302232815082 session 管理 Spring Security 通过 http 元素下的子元 ...
- [Java][Spring][scurity]同步session控制,防止一个用户多次登录
[Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1. ...
随机推荐
- Python21之内嵌函数和闭包
一.内嵌函数 内嵌函数指的是在一个函数体内部定义的函数,可以称它为函数的函数,也就是子函数,外部的函数称之为母函数,就类似局部变量和全局变量 子函数体内定义的变量只在其函数内部有效,但其内部可以调用母 ...
- python 之 数据库(创建表的完整语法、基本数据类型)
10.4 创建表的完整语法 create table 表名( 字段名1 类型[(宽度) 约束条件], 字段名2 类型[(宽度) 约束条件], 字段名3 类型[(宽度) 约束条件] ); #类型:使用限 ...
- RMAN备份,catalog注册rman带库备份信息
客户需求:测试恢复的过程中,控制文件是全备时期的,recover database无法恢复到指定日期,控制文件中缺失后续新的归档备份信息. 方法:1.控制文件rman注册后续带库中的归档备份: 2.使 ...
- 常用NLog配置
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSe ...
- Matlab匿名函数,向量化和预分配,函数的函数,P码文件
匿名函数: 匿名函数是不存储在程序文件中.但与数据类型是 function_handle 的变量相关的函数.匿名函数可以接受输入并返回输出,就像标准函数一样.但是,它们可能只包含一个可执行语句. 例如 ...
- 数据结构与算法---排序算法(Sort Algorithm)
排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载 到内部存储器(内存)中进 ...
- md5 helper
public static string ToMD5Hash(this string str) { if (string.IsNullOrEmpty(str)) return null; return ...
- 【转载】C#使用as关键字将对象转换为指定类型
在C#的编程开发过程中,很多时候涉及到数据类型的转换,可使用强制转换的方式,不过强制转换数据类型有时候会抛出程序异常错误,可以使用as关键字来进行类型的转换,如果转换成功将返回转换后的对象,如果转换不 ...
- Scrapy 安装与使用
Scrapy的安装: 当前环境win10,python_3.6.4,64bit.在命令提示符窗口运行pip install Scrapy,出现以下结果: building 'twisted.test. ...
- nginx 反向代理配置(二)
上一篇文章主要是对 nginx 各个模块做了一个介绍,以及对什么是反向代理在文章开头做了一个简单介绍,这篇文章我们主要来看下如何进行 nginx 反向代理的配置 proxy 模块 nginx ...