Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建异步Spring身份验证提供程序_Java_Spring_Authentication_Spring Mvc_Spring Security - Fatal编程技术网

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

Java 如何创建异步Spring身份验证提供程序,java,spring,authentication,spring-mvc,spring-security,Java,Spring,Authentication,Spring Mvc,Spring Security,我们有一些使用Spring的Spring MVC web服务。据我所知,这允许更大的可伸缩性,因为web容器创建的线程更少 我们还使用Spring Security来保护我们的服务。是否可以使身份验证管理器和身份验证提供程序也异步运行 我们的身份验证提供商需要访问数据库或外部web服务。因此,web请求的身份验证部分肯定会有一些延迟。如果没有异步身份验证管理器,异步控制器方法的好处似乎会减少 authenticate()方法是一种同步方法 澄清一下,我不是说从异步MVC控制器中获取Spring凭

我们有一些使用Spring的Spring MVC web服务。据我所知,这允许更大的可伸缩性,因为web容器创建的线程更少

我们还使用Spring Security来保护我们的服务。是否可以使身份验证管理器和身份验证提供程序也异步运行

我们的身份验证提供商需要访问数据库或外部web服务。因此,web请求的身份验证部分肯定会有一些延迟。如果没有异步身份验证管理器,异步控制器方法的好处似乎会减少

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"/>

我的web控制器如下所示

@RequestMapping(value = "{id}", method = RequestMethod.GET)
@ResponseBody
public Callable<ResponseEntity> getData(@PathVariable String id) {
    return new Callable<ResponseEntity>() {
        @Override
        public ResponseEntity call() throws Exception
        {
        }
}
@RequestMapping(value=“{id}”,method=RequestMethod.GET)
@应答器
公共可调用getData(@PathVariable字符串id){
返回新的可调用(){
@凌驾
public ResponseEntity调用()引发异常
{
}
}
当然,我有一个CustomAuthenticationManager的实现

从我对Spring安全性和MVC的理解来看,这是Spring正在做的一个粗略的表示

  • Spring Security通过过滤器接收请求
  • Spring Security将此提供给身份验证管理器,该管理器使用提供的身份验证提供程序(CustomAuthenticationManager)
  • 身份验证提供程序对用户进行身份验证并获取其权限
  • 如果用户拥有正确的权限,Spring将调用我的web控制器(getData)
  • 当Spring接收到可回调时,Spring调用AsyncContext.start(Runnable)
  • 当可调用完成时,Spring完成AsyncContext
  • 我还想补充的是第3步

    • 身份验证提供程序(以某种方式)告诉Spring它是异步的

    • Spring调用AsyncContext.start(可运行)

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

    • Spring完成了异步上下文


    不确定这意味着什么“Spring身份验证提供程序是一种同步方法。”AuthenticationProvider是一个接口,其方法同步性取决于您正在使用的实现。您是否询问可调用线程是否将使用与调用线程相同的身份验证运行?如果是,似乎即将发布的版本将使用authenticate()我的意思是方法是同步的。是的,我可以在内部使其异步,但这对servlet 3来说还不够,对吗?关键是调用servlet请求。authenticate方法是不同步的。也许我不理解您的术语?AuthenticationProviders通常会对存储在threadlocal上下文中的令牌进行身份验证,因此,如果没有自定义管道,或Spring Security 3.2.0-M1或更高版本,可调用的将不会继承身份验证。这是否回答了您的问题?谢谢您的帮助Taylor。我扩展了一些问题,试图澄清我希望实现的目标。本质上,我希望我的servlet两次异步。因此,对于Ca中的任何内容要在身份验证下运行,您必须在该线程中对用户进行身份验证。Spring Security的身份验证内容基于用户已在该线程中成功进行身份验证的想法。然后,该线程继续执行您想要的任何操作(读取记录、写入数据等)假设身份验证成功。这需要在线程中进行身份验证。