如何创建异步Spring身份验证提供程序

时间:2013-11-22 18:19:53

标签: java spring authentication spring-mvc spring-security

我们有一些使用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正在做的事情的粗略表现。

  1. Spring Security通过过滤器接收请求
  2. Spring Security将此提供给Authentication Manager,后者使用提供的身份验证提供程序(CustomAuthenticationManager)
  3. 身份验证提供程序对用户进行身份验证并获取其权限
  4. 如果用户具有正确的权限,则Spring会调用我的Web控制器(getData)。
  5. 当Spring收到Callable后,Spring调用AsyncContext.start(Runnable)。
  6. 当Callable完成时,Spring完成AsyncContext。
  7. 我想要添加的内容还有步骤#3。

    • 身份验证提供程序告诉Spring(不知何故)它是异步的。

    • Spring调用AsyncContext.start(Runnable)

    • 身份验证提供程序需要一段时间进行身份验证,然后返回结果

    • Spring完成AsyncContext

0 个答案:

没有答案