Spring Security 3.2 M1 亮点,Servlet 3 API 支持
上周我宣布发布 Spring Security 3.2 M1,其中包含改进的 Servlet 3 支持。在这篇文章中,我将介绍 3.2 M1 版本中的一些更令人兴奋的功能。具体来说,我们将看看以下新的 Spring Security 功能
并发支持
您可能会问“并发支持在以 Servlet 3 为中心的版本中扮演什么角色?”原因是并发支持为本版本中的所有其他功能提供了基础。虽然并发支持由 Servlet 3 集成使用,但它也可以作为构建块来支持任何应用程序中的并发和 Spring Security。现在让我们看看 Spring Security 的并发支持。
DelegatingSecurityContextRunnable
Spring Security 并发支持中最基本的基础构建块之一是DelegatingSecurityContextRunnable
。它包装一个委托的Runnable
,以便使用指定的SecurityContext
为委托初始化SecurityContextHolder
。然后,它调用委托的Runnable
,并确保之后清除SecurityContextHolder
。DelegatingSecurityContextRunnable
看起来像这样
public void run() {
try {
SecurityContextHolder.setContext(securityContext);
delegate.run();
} finally {
SecurityContextHolder.clearContext();
}
}
虽然非常简单,但它使在Thread
之间传输SecurityContext
变得无缝。这很重要,因为在大多数情况下,SecurityContextHolder
基于每个Thread
。例如,您可能已使用 Spring Security 的<global-method-security> 支持来保护您的其中一项服务。您现在可以轻松地将当前Thread
的SecurityContext
传输到调用受保护服务的Thread
。下面是一个关于如何执行此操作的示例
Runnable originalRunnable = new Runnable() {
public void run() {
// invoke secured service
}
};
SecurityContext context = SecurityContextHolder.getContext();
DelegatingSecurityContextRunnable wrappedRunnable =
new DelegatingSecurityContextRunnable(originalRunnable, context);
new Thread(wrappedRunnable).start();
上面的代码执行以下步骤
- 创建一个将调用我们受保护服务的
Runnable
。请注意,它不知道 Spring Security - 从
SecurityContextHolder
获取我们希望使用的SecurityContext
,并初始化DelegatingSecurityContextRunnable
- 使用
DelegatingSecurityContextRunnable
创建一个Thread
- 启动我们创建的
Thread
由于使用SecurityContextHolder
中的SecurityContext
创建DelegatingSecurityContextRunnable
非常常见,因此有一个快捷构造函数。以下代码与上面的代码相同
Runnable originalRunnable = new Runnable() {
public void run() {
// invoke secured…