2013-02-12 16 views
11
  1. Jakie są zalety, aby zdobyć kapitał jako parametr Principal principal w kontrolerze sprężyny, a następnie przekazać je do warstwy usług na uzyskanie kapitału w warstwie usług natychmiast chociaż SecurityContextHolder.getContext().getAuthentication().getPrincipal()?
  2. Jakie jest najlepsze podejście do pobierania danych podstawowych w warstwie usług bez sprawdzania obiektów o wartości null wszędzie (coś w rodzaju niestandardowego opakowania)?
+1

Możesz znaleźć odpowiedzi na [to pytanie] (http://stackoverflow.com/questions/248562/when-using-spring-security-what-is-t-proper-way-to-obtain- current-username-i) przydatne. [Ta odpowiedź] (http://stackoverflow.com/questions/8764545/best-practice-for-getting-active-users-userdetails/8765597#8765597) również może być przydatna. –

+0

Czy to dobre rozwiązanie, aby mieć klasę abstrakcyjną ze statyczną metodą, gdzie mogę umieścić 'SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal()'? Potem mogę go użyć w warstwie usług. – Alex

+0

Przeczytaj drugi link, który dałem ci ponownie. Nie ma nic, co mogłoby Cię powstrzymać od użycia tego podejścia w twoich usługach i jeśli używasz interfejsu, możesz go również zamienić na testowanie. –

Odpowiedz

9
    • Twój API usługa będzie bardziej łatwy w użyciu. Bezpośrednio zobaczysz zależność od zleceniodawcy, więc nie możesz przez przypadek wywołać metody obsługi w środowisku, w którym nie istnieje zlecenie.
    • Generalnie mniej zależności na kodzie SpringSecurity oznacza mniejsze problemy w przypadku migracji do nowej wersji Spring Security.
    • Będziesz mógł ponownie użyć warstwy usługi w środowisku, w którym Spring Security nie istnieje.
  1. Przygotuj klasę opakowania (na przykład AuthenticationService). Dodaj do tego metodę getPrincipal(). Wprowadź swoje kontrole. Wstrzykiwanie usługi uwierzytelniania wszędzie za pośrednictwem bezpośrednich połączeń z SecurityContextHolder.
+0

Jeśli potrzebuję uzyskać dane dla konkretnego użytkownika, myślę, że uzyskanie nazwy użytkownika (na przykład nazwy użytkownika) w warstwie usługi jest bezpieczniejsze, ponieważ między tym (ograniczeniem) a bazą danych jest mniej warstw. Jest to więc jedyne dao, które zostało w przeciwieństwie do zdobywania kapitału w kontrolerze (dodatkowa warstwa usług pomiędzy). Z drugiej jednak strony, jak już powiedziałeś, warstwa usługowa może być bardziej przydatna do ponownego użycia. Co sądzisz o tym? – Alex

+1

Główny obiekt jest przechowywany i przechowywany w warstwie internetowej. Dla mnie wygląda to naturalnie, że zleceniodawca wszedł od contollera do warstwy serwisowej. Inną kwestią jest to, że zależności statyczne są złe dla testów jednostkowych: http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/. Nie widzę żadnych problemów związanych z bezpieczeństwem, ponieważ instancja numeru końcowego jest niezmienna (i zazwyczaj hasło zostanie w tym momencie zerwane z rzeczywistej implementacji). Przepraszam za spóźnienie. Byłem przez długi czas AFK. –

+0

Czy korzystanie z opcji 2 w rozszerzonej wersji BaseService (w warstwie serwisowej) jest bezpieczne? – Alex

Powiązane problemy