慕的地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());
}
}
}
添加回答
舉報
0/150
提交
取消