【问题标题】:Spring bean always returns same value even when condition is false即使条件为假,Spring bean 也总是返回相同的值
【发布时间】:2019-12-24 23:46:50
【问题描述】:

我正在使用 spring data jpa 为我的实体填充审计数据。

我们有一个每晚运行的石英作业,它不会经过身份验证,在这种情况下,我们希望“createdBy”值为“system”。在其他情况下,我们希望它填充当前登录的用户。

当我通过 UI 创建采购订单时,“createdBy”字段始终填充“系统”而不是当前登录的用户 ID。

我尝试让 AuditorAware bean 变得惰性并将范围更改为原型,但它们都不起作用。 我在代码中放了一个断点,我可以看到 SecurityContext 和 Authentication 对象不为空,但它仍然返回“system”

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Purchase{
    String purchaseNbr;
    @CreatedBy
    private String createdBy;
}

@Configuration
@EnableJpaAuditing
public class Auditconfig{
    @Bean
    public AuditorAware<String> auditAware(){
        if(SecurityContextHolder.getContext()==null || SecurityContextHolder.getContext.getAuthentication() == null ) {
             //during spring context initialization, i can see this branch gets hit, if i put a breakpoint here
             return () -> Optional.of("system");
        }else {
             //this branch never gets hit even when "if" condition is false during runtime
             return () -> Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());
         }

    }
}

预期“createdBy”是当前用户,但始终是“系统”

【问题讨论】:

  • 您发布的代码可能无法编译。您从一个应该返回 AuditorAware. 的方法返回一个字符串
  • @JBNizet 我们不允许在外面复制粘贴我们的代码。所以不得不打字。这是一个错字。我已经进行了上述更改。
  • 在启动时,您将返回一个始终返回Optional.of("system") 或始终返回Optional.of(Security...) 的对象,具体取决于创建bean 时的安全上下文的值。在启动时,它总是为空?所以你返回一个总是返回 Optional.of("system") 的对象。您需要将 if 语句 ** 放在** 箭头之后:return () -&gt; { if (...) { return ...; } else { return ... }/ 这样每次调用 AuditorAware 时,您都会检查当时的身份验证值。
  • @JBNizet 这工作问你建议。如果您可以发表评论作为答案,我会接受。谢谢。

标签: java oracle hibernate jpa spring-data-jpa


【解决方案1】:

auditAware() 方法只在启动时执行一次。此时,没有当前用户。所以你总是回来

() -> Optional.of("system")

并且这个 AuditorAware 实例,无论何时被调用,都会因此总是返回

Optional.of("system")

您想要的是一个 AuditAware,它在以后被调用时会测试当前用户是谁,并确定它应该返回什么。所以应该是

@Bean
public AuditorAware<String> auditAware(){
    return () -> {
        if (SecurityContextHolder.getContext() == null || SecurityContextHolder.getContext.getAuthentication() == null) {
            return Optional.of("system");
        } else {
            return Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 2019-04-05
    • 2022-06-28
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    相关资源
    最近更新 更多