簡體   English   中英

使用Spring Security自動連接依賴注入

[英]Autowired Dependency Injection with Spring Security

我有一個帶有注釋驅動配置的spring webapp。

所有控制器,存儲庫都是自動裝配的。

在集成Spring Security時,我定義了一個單獨的security-app.xml。 我創建了一個名為LoginUserService的服務,它實現了UserDetailsS​​ervice。 現在調用此類的方法loadUserByUsername()方法進行身份驗證。

此類具有UserRepository的自動連接依賴項。 現在這個自動連接的依賴關系變成了null。 為了解決這個問題,我啟用了注釋驅動配置,並在組件掃描配置中添加了存儲庫類的包名稱。

此解決方案還在此處討論了Spring安全性和自定義用戶詳細信息

但現在的問題是UserRepository有一個帶有@PersistenceContext注釋的EntityManager字段。 對於spring安全配置,它能夠找到UserRepository但無法找到實體管理器。 我應該在這里創建一個新的EntityManagerFactory嗎? 我想這將在我的應用程序中創建兩個持久性單元?

如何為使用原始servlet xml創建的UserRepository注入自動連接的依賴項?

更新

這里簡要討論一下: https//stackoverflow.com/a/7078395/161628

但我想一個規范的詳細答案對我來說會更有用。

更新

如何使用ApplicationContext在運行時獲取UserRepository?

if (userRepository == null) {
    userRepository = ApplicationContextProvider.getApplicatonContext().getBean(UserRepository.class);
}

為什么Spring的ApplicationContext.getBean被認為是壞的?

編輯:您在DispatcherServlet的配置中聲明的Bean將不會對您在contextConfigLocation配置文件中聲明或組件掃描的任何bean可用。 因此,在這種情況下,如果您在為DispatcherServlet加載的配置文件中設置JPA配置,則無法將其連接到您在安全配置中聲明的bean。 您需要將任何“核心”bean配置(數據源配置,數據庫連接池配置,JPA / Hibernate配置,存儲庫/服務組件掃描等)移動到您通過contextConfigLocation加載的配置文件中。 然后,這些東西將可用於您的安全bean和您的MVC bean。 我認為通常的想法是只在DispatcherServlet配置中加載MVC特定的bean(例如控制器,視圖,請求處理程序,請求范圍的bean等)。 這樣,您可以確保在MVC代碼和非MVC代碼之間實現清晰的分離,只需要從MVC代碼到“核心”代碼的單向依賴關系,並且在“核心”代碼中不依賴於MVC代碼。 這有助於使您的代碼更加模塊化,並且可以更輕松地以其他方式重用“核心”代碼,特別是在單元測試中。

(原始評論文本詢問如何加載安全配置,如果它在contextConfigLocation或其他地方。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM