当前位置: 首页 > 面试题库 >

Java Future-Spring Authentication在AuditorAware中为空

公孙慎之
2023-03-14
问题内容

这是我的情况:

我的应用程序启用了Mongo
Auditing,并使用了自定义的AuditorAware,可从中获取当前用户SecurityContext。这在同步方法中效果很好,并且当前的审计程序已成功保存,但是我无法使其在@Async方法中正常工作。

我有一个异步方法(CompletableFuture),可对Mongo数据库进行一些更新。当AuditorAware.getCurrentAuditor()被调用时,没有任何身份验证信息存在,我不能让现任核数师(SecurityContextHolder.getContext().getAuthentication()回报null)。

@Override
public User getCurrentAuditor() {
   Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

   if (authentication == null || !authentication.isAuthenticated()
                || authentication instanceof AnonymousAuthenticationToken) {
            log.error("Not authenticated");
            return null;
    }

    [...]

}

我正在使用DelegatingSecurityContextAsyncTaskExecutor

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(200);
        executor.initialize();

        return new DelegatingSecurityContextAsyncTaskExecutor(executor);
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new ItacaExceptionHandler();
    }

}

如何使它正常工作?


问题答案:

Spring安全上下文始终绑定到Threadlocal。

可能您可能还需要为安全上下文设置MODE_INHERITABLETHREADLOCAL。

@Bean
public MethodInvokingFactoryBean methodInvokingFactoryBean() {
    MethodInvokingFactoryBean methodInvokingFactoryBean = new MethodInvokingFactoryBean();
    methodInvokingFactoryBean.setTargetClass(SecurityContextHolder.class);
    methodInvokingFactoryBean.setTargetMethod("setStrategyName");
    methodInvokingFactoryBean.setArguments(new String[]{SecurityContextHolder.MODE_INHERITABLETHREADLOCAL});
    return methodInvokingFactoryBean;
}

http://www.ogrigas.eu/spring/2010/04/inherit-spring-security-context-in-
child-threads



 类似资料:
  • 我正在处理一个项目,该项目有一个线程池,它向其中提交任务。可以说,每项任务都是一条链条。当任务执行时,它会执行它需要执行的操作,然后检查结果。这些任务中的每一个都包含一个结果映射(只是一个枚举)和其他任务。在同一个线程中调用这些结果,循环重复,直到不再有任务为止,此时它返回到链的上游,将每个结果添加到集合中,并将其返回到主线程。Q 请记住,这也是一个我还没有真正测试过的原型,所以我知道这可能不完美

  • 我试图从登录用户那里获取UUID,将其存储为“CreatedBy”和“LastUpdatedBy”,而不仅仅是字符串。然而,我得到了一个演员错误: 类java。无法将lang.String转换为类com。实例林。容器容器 下面的所有代码。。。谢谢 大编辑: 我更改了应用程序用户以实现来自SpringSecurity的用户详细信息,并向我的基本实体添加了合法的映射关系。现在我得到了一个新的异常。我很

  • 我们在应用程序中使用了Hibernate/JPA、Spring、Spring Data和Spring Security。我有一个标准的实体,它是使用JPA映射的。此外,我还有一个 它遵循Spring数据约定来命名查询方法。我有一个实体 如何避免这种递归?是否有“规范的方式”来加载实体?或者有没有一种方法可以防止Hibernate/JPA冲洗?

  • 问题内容: 我们在应用程序中使用Hibernate / JPA,Spring,Spring Data和Spring Security。我有一个使用JPA映射的标准实体。此外,我有一个 它遵循Spring Data约定来命名查询方法。我有一个实体 我想使用Spring Data审核支持。(如此处所述。)因此,我创建了一个如下: 当我创建一个方法时 一切都正确接线的地方是Spring Data 。然后

  • 我试图在我当前的项目中使用Spring数据JPA(1.6.2)。一切似乎都很好,但我在实现AuditorAware接口时遇到了问题。 我的应用程序将部署到一个旧的Apache Jetspeed JSR168兼容门户。此门户负责用户身份验证/授权。因此,我不必使用像Spring security或Shiro这样的安全框架。我的应用程序中的其他框架包括: Struts 1.2.4(带Struts入口桥

  • 本文向大家介绍基于Spring Data的AuditorAware审计功能的示例代码,包括了基于Spring Data的AuditorAware审计功能的示例代码的使用技巧和注意事项,需要的朋友参考一下 Spring Data提供支持审计功能:即由谁在什么时候创建或修改实体。Spring Data提供了在实体类的属性上增加@CreatedBy,@LastModifiedBy,@CreatedDat