我们有一些使用Spring support for async servlets的Spring MVC Web服务。据我了解这个概念,这可以提高可扩展性,因为Web容器可以创建更少的线程。
我们还使用Spring Security来保护我们的服务。是否可以使身份验证管理器和身份验证提供程序异步运行?
我们的身份验证提供程序需要访问数据库或外部Web服务。因此,Web请求的身份验证部分肯定会有一些延迟。如果没有异步身份验证管理器,似乎可以降低异步控制器方法的优势。
Spring Authentication Provider authenticate()方法是一种同步方法。
为了澄清,我不是在谈论从异步MVC控制器中获取Spring凭据。我已经找到了大量的文档。
以下是我目前定义Spring安全应用程序上下文的方法。
<http auto-config="true" entry-point-ref="authenticationEntryPoint" create-session="never" use-expressions="true">
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN') or hasRole('ROLE_USER')"/>
</http>
<authentication-manager>
<authentication-provider ref="myAuthenticationProvider" />
</authentication-manager>
<beans:bean name="myAuthenticationProvider" class="com.testing.CustomAuthenticationManager"/>
我的网络控制器看起来如下所示。
@RequestMapping(value = "{id}", method = RequestMethod.GET)
@ResponseBody
public Callable<ResponseEntity> getData(@PathVariable String id) {
return new Callable<ResponseEntity>() {
@Override
public ResponseEntity call() throws Exception
{
}
}
当然,我有CustomAuthenticationManager的实现。
根据我对Spring Security和MVC的理解,这是Spring正在做的事情的粗略表现。
我想要添加的内容还有步骤#3。
身份验证提供程序告诉Spring(不知何故)它是异步的。
Spring调用AsyncContext.start(Runnable)
身份验证提供程序需要一段时间进行身份验证,然后返回结果
Spring完成AsyncContext