2013-02-12 22 views
11
  1. 有哪些優勢獲得本金如春控制器參數Principal principal,然後把它傳遞給服務層之上,雖然SecurityContextHolder.getContext().getAuthentication().getPrincipal()在服務層立即獲得本金?
  2. 什麼是在沒有檢查getAuthentication()getPrincipal()對象的情況下在服務層獲取主要細節的最佳方法(類似於自定義包裝器)?
+1

你可能會找到[這個問題]的答案(http://stackoverflow.com/questions/248562/when-using-spring-security-what-is-the-proper-way-to-obtain- current-username-i)有用。 [這個答案](http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8765597#8765597)也可能有用。 – 2013-02-13 14:13:34

+0

這是一個很好的解決方案,讓抽象類與靜態方法,我可以把'SecurityContextHolder.getContext()。getAuthentication()。getPrincipal()'?之後,我可以在服務層中使用它。 – Alex 2013-02-14 00:40:24

+0

閱讀我給你的第二個鏈接。沒有什麼可以阻止你在你的服務中使用這種方法,並且如果你使用一個接口,你也可以將它交換出來進行測試。 – 2013-02-14 01:59:29

回答

9
    • 您的服務API將更加易於使用。您將直接看到對主體的依賴關係,因此您不會在主體不存在的環境中錯誤地調用某種服務方法。
    • 通常,對SpringSecurity代碼的較少依賴意味着在遷移到新的Spring Security版本時,問題較少。
    • 您將能夠在Spring Security不存在的環境中重用您的服務層。
  1. 準備一些包裝類(例如AuthenticationService)。將getPrincipal()方法添加到它。實施你的支票。將AuthenticationService直接調用到SecurityContextHolder的任何地方。
+0

如果我需要爲特定用戶獲取一些數據,我認爲在服務層獲得一個主體(例如用戶名)更安全,因爲此(限制)和數據庫之間的層數較少。所以這是唯一的道,而不是在控制器中獲得委託人(其間的附加服務層)。但另一方面,正如你所說的,服務層可以更加可重用。你對此有何看法? – Alex 2013-02-13 00:32:53

+1

主要對象由web層保存並保留。所以對我來說,委託人從控制器到服務層看起來很自然。還有一點是靜態依賴對單元測試不利:http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/。我沒有看到任何安全問題,因爲一個pincipal實例是不可變的(通常密碼在這個時候將從實際實現中被擦除)。不好意思推遲了。我很長時間是AFK。 – 2013-02-27 18:08:40

+0

在擴展BaseService(服務層)中使用您的選項2是否安全? – Alex 2013-03-07 12:40:19

相關問題