我在服務層中有一個從隊列中讀取消息的異步方法。我需要將收到的消息發送給當前登錄用戶的用戶。用彈簧安全提取服務層中登錄的用戶
在我控制我獲取用戶的
(CustomUserDetail)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
其工作正常,但在業務層相同的代碼拋出一個 NullPointerException
。可能是由於SecurityContextHolder
不是在相同的請求響應流中調用而不是異步調用,但同時我認爲Spring Security會保留會話中的所有用戶安全數據。所以它應該可以正常工作。
任何人都可以提出一種解決方法。如何獲取服務層中登錄的用戶?
我覺得一種可能的方式是,當控制器方法將消息推送到隊列&然後從服務層的會話中檢索用戶時,可以將活動用戶添加到會話中。
感謝您的建議,我添加身份驗證對象的消息。現在工作正常。我還嘗試了其他方式在會話中添加用戶對象,RequestContextHolder等,但將消息傳遞給身份驗證對象是最乾淨的。 – underdog