Seam: Zalogowany użytkownik przechowywany w sesji
Jakiś czas temu poruszałem temat zapamiętywania w sesji danych zalogowanego użytkownika. Właściwie to chodziło mi o zilustrowanie przeciążania komponentów tożsamości i magazynu tożsamości.
Tym razem pokażę, jak przechowywać w sesji całą encję zalogowanego użytkownika. Temat ten rozpocznie nieco dłuższy cykl wpisów na temat wstrzykiwania zależności w JBoss Seam. Ale po kolei…
Użytkownik będzie przechowywany bezpośrednio w kontekście, więc rozszerzona klasa tożsamości nie będzie mi potrzebna. Za to będę musiał dokonać kilku zmian w rozszerzonym magazynie tożsamości (EnhancedJpaIdentityStore) – w metodzie uwierzytelniającej.
Na początek zdefiniuję pole zawierające zalogowanego użytkownika:
@Out(scope = ScopeType.SESSION) private User loggedInUser;
Adnotacja @Out posłuży do „wstrzyknięcia” obiektu do kontekstu. Parametr scope określa zakres widoczności komponentu – w tym wypadku jest to sesja (ScopeType.SESSION).
Użytkownik będzie ustawiany po udanym uwierzytelnieniu. Zatem metoda authenticate będzie wyglądać następująco:
@Override
public boolean authenticate(
String username, String password) {
boolean success =
super.authenticate(username, password);
if (success) {
loggedInUser = this.lookupUser(username);
}
return success;
}
Teraz w ramach sesji dowolny komponent będzie mógł skorzystać z informacji dotyczących zalogowanego użytkownika. Wystarczy zdefiniować dla niego pole:
@In(scope = ScopeType.SESSION) private User loggedInUser;
Adnotacja @In zachowuje się podobnie do @Out, jednak tym razem obiekt z kontekstu jest wstrzykiwany do komponentu.
Podczas wstrzykiwania zależności należy pamiętać, że nazwa obiektu z adnotacją @In musi być taka sama jak w przypadku @Out. W razie gdyby oba pola musiały nazywać się różnie, można przesłonić oryginalną nazwę komponentu za pomocą parametru value dla dowolnej (lub obu) adnotacji.
Myślę, na pierwszy raz tyle informacji wystarczy. Następnym razem postaram się nieco przybliżyć pojęcie kontekstu oraz rodzaje kontekstów w Seam.



