2011-08-24 75 views
8

在SpringSecurity它有一个类名SecurityContextHolder中及其规范:“同事给定的SecurityContext与当前执行线程。”有了Web应用程序,每当请求到达服务器时,Spring也会在SecurityContextHolder中为其线程重新加载并设置该请求的SecurityContext?Spring Security如何通过Web应用程序请求管理线程中的SecurityContext?

+0

请参阅http://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-bound – Ritesh

回答

7

随着Web应用程序每当请求到服务器,然后Spring也重新加载并设置该请求的SecurityContext在SecurityContextHolder为其线程?

基本上是肯定的。

SecurityContextHolder.getInstance()的默认行为是返回一个作为当前线程的线程本地存储的SecurityContextHolder实例。 (这只是默认的机制,你可以通过调用SecurityContextHolder.setStrategemName()使用不同的战略定位SecurityContextHolder

一个SpringSecurity过滤器确保请求的SecurityContextHolder(但它的位置)加载在开始请求证书和在请求处理结束时清除持有者。

+0

诠,关键是过滤器中查找安全远程调用属性上下文。只有在远程调用属性中存在安全上下文时,才可以在SecurityContextHolder中设置它。此安全上下文通常由客户端提供,并使用类似的过滤器来处理外发调用,并将安全上下文从本地线程放置到远程调用中。 – Zach

+0

[为什么这不起作用](https://github.com/spring-projects/spring-security/issues/3919)对我来说?请参阅[stackoverflow问题](http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not-shared-across-thread)。 – displayname

9

是的,SecurityContextPersistenceFilter注意到了这一问题。默认情况下,它将SecurityContext定位到HttpSession中,并通过SecurityContextHolder将其绑定到线程。当请求完成处理时,它会做相反的处理 - 它从线程中获取SecurityContext并将其放入会话中。

从Javadoc中:

用从所述 获得的信息通过SecurityContextHolder配置SecurityContextRepository请求并存储 之前它放回仓库一旦请求已完成和清除 上下文保持器。默认情况下,它使用一个 HttpSessionSecurityContextRepository。

+0

不应该让它也是线程安全的吗?看来,'SecurityContext'不被跨线程共享我的应用程序([链接](http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not -shared-跨线程))。 – displayname

相关问题