2013-02-27 14 views
6

W mojej aplikacji mogę zmienić uprawnienia użytkownika i role w zapleczu.Wymuś ponowne uwierzytelnianie po zmianie uprawnień użytkownika

Po zalogowaniu użytkownika i usunięciu roli użytkownika, użytkownik może nadal uzyskiwać dostęp do treści, do których faktycznie nie ma dostępu, ponieważ brakuje mu tej roli. Zmiany obowiązują tylko wtedy, gdy użytkownik ponownie uwierzytelni się przy wylogowaniu/zalogowaniu.

Moje pytanie brzmi, czy mogę uzyskać dostęp do sesji zalogowanego użytkownika (nie ja)? Wiem, że mogę uzyskać dostęp do własnej sesji i ją zniszczyć, co zmusza mnie do ponownego zalogowania. Ale chcę uzyskać sesję każdego użytkownika, który jest zalogowany. Czy to możliwe? Nie mogłem znaleźć żadnych zasobów na ten temat.

Używam PdoSessionStorage z symfony2.1 i fosuserbundle.

+0

także tutaj, bez odpowiedzi. http://stackoverflow.com/questions/14184484/how-to-administrative-invalidate-a-session-that-used-remember-me-option – MDrollette

+0

@MDrollette Czuję, że odpowiedź na to pytanie nie zostanie udzielona. Myślę, że jedynym rozwiązaniem może być niestandardowy menedżer sesji –

+0

Byłoby to tylko kwestią przechowywania ID użytkownika wraz z identyfikatorem sesji w tabeli sesji. Nie brzmi to szczególnie trudne, ale nie jestem też pewny najlepszego podejścia. – MDrollette

Odpowiedz

9

Wykonaj swoją klasę użytkownika implementuj Symfony\Component\Security\Core\User\EquatableInterface.

Jeśli zwrócisz false z metody isEqualTo(), użytkownik zostanie ponownie uwierzytelniony. Użyj tej metody, aby porównać tylko te właściwości, które po zmianie powinny wymuszać ponowne uwierzytelnianie - role w twojej sprawie.

+0

+1 Ok Rozumiem to. Gdzie muszę dokonać tej kontroli? Muszę to zrobić na każde żądanie? –

+0

Wystarczy, że twoja klasa użytkownika zaimplementuje interfejs. Będziesz zmuszony do wdrożenia metody 'isEqualTo()'. Reszta jest obsługiwana przez Symfony. –

+0

Świetne, co działa!) –

-1

Można obejść ten problem, wykonując podejście podobne do tego, co zrobiłem:

  1. Kiedy użytkownik loguje się, przechowywać wszystkie uprawnienia w sesji wraz z sumą kontrolną z tych uprawnień.
  2. Store taka sama suma kontrolna w bazie danych lub na dysk, wobec tego identyfikatora użytkownika
  3. Gdy użytkownik złoży wniosek, należy sprawdzić, czy suma kontrolna na dysku odpowiada jeden w sesji dla tego użytkownika. Jeśli jest inaczej, ponownie załaduj uprawnienia do sesji użytkownika.
  4. Po zmianie uprawnień należy zaktualizować sumę kontrolną w bazie danych (lub na dysku), która jest przechowywana dla tego użytkownika. Spowoduje to ponowny zsynchronizowanie podczas następnego żądania.
+0

Hm wygląda interesująco, ale jest równie złożony. Czy to jest jakiś rodzaj helpdesku, który rozwijasz? –

+0

@artworkad シ nie jest to zbyt skomplikowane, ponieważ używa podstawowych komponentów symfony2, takich jak kontener usługi, kontekst zabezpieczeń i obiekt żądania, aby określić, co zrobić z uprawnieniami. – JamesHalsall

+0

@Jaitsu, wbudowane rozwiązanie Symfony jest * takie * proste, będziesz śmiać się histerycznie. Zobacz moją odpowiedź. ;) –

Powiązane problemy