为了账号安全,请及时绑定邮箱和手机立即绑定

即使条件为假,Spring bean 也总是返回相同的值

即使条件为假,Spring bean 也总是返回相同的值

慕的地8271018 2023-06-14 14:29:41
我正在使用 spring data jpa 为我的实体填充审计数据。我们有一个每晚运行的 quartz 作业,它不会被验证,在这种情况下,我们希望“createdBy”值为“system”。在其他情况下,我们希望它填充当前登录的用户。当我通过 UI 创建 Purcahse 订单时,“createdBy”字段始终填充有“system”,而不是当前登录的用户 ID。我尝试让 AuditorAware bean 变得懒惰并将范围更改为原型,但它们都不起作用。我在代码中放置了一个断点,我可以看到 SecurityContext 和 Authentication 对象不为空,但它仍然返回“系统”@Entity@EntityListeners(AuditingEntityListener.class)public class Purchase{    String purchaseNbr;    @CreatedBy    private String createdBy;}@Configuration@EnableJpaAuditingpublic 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”是当前用户,但始终是“系统”
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

该方法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());

        }

    }

}


查看完整回答
反对 回复 2023-06-14
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信