Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SF][SF2][Symfony2] Którzy userzy są obecnie zalogowani ?
Forum PHP.pl > Forum > PHP > Frameworki
damianooo
Jak sprawdzić jacy użytkownicy są obecnie zalogowani w naszej aplikacji ?
Chciałbym wyświetlać listę zalogowanych użytkowników w Twigu.
Korzystam z Symfony 2.8 .
Użytkowników przechowuję w bazie danych.

Mój security.yml :

  1. security:
  2.  
  3. encoders:
  4. AppBundle\Entity\User:
  5. algorithm: bcrypt
  6.  
  7. role_hierarchy:
  8. ROLE_ADMIN: ROLE_USER
  9. ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
  10.  
  11. providers:
  12. my_users:
  13. entity:
  14. class: AppBundle:User
  15. property: username
kajti
Musisz sobie utworzyć nową kolumnę w bazie danych np. lastActivityAt do tego dopisać jakiś serwis który będzie Ci aktualizował to pole przy wykonaniu jakieś akcji.
Moje rozwiązanie jest co prawda dla FOS ale to nie problem przerobić je.
  1. <?php
  2. namespace AppBundle\EventListener;
  3.  
  4. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterfa
    ce;
  5. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  6. use Symfony\Component\HttpKernel\HttpKernel;
  7. use FOS\UserBundle\Model\UserManagerInterface;
  8. use FOS\UserBundle\Model\UserInterface;
  9.  
  10. class ActivityListener
  11. {
  12. protected $securityContext;
  13. protected $userManager;
  14.  
  15. public function __construct(TokenStorageInterface $securityContext, UserManagerInterface $userManager)
  16. {
  17. $this->securityContext = $securityContext;
  18. $this->userManager = $userManager;
  19. }
  20.  
  21. public function onCoreController(FilterControllerEvent $event)
  22. {
  23. // Check that the current request is a "MASTER_REQUEST"
  24. // Ignore any sub-request
  25. if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
  26. return;
  27. }
  28.  
  29. // Check token authentication availability
  30. if ($this->securityContext->getToken()) {
  31. $user = $this->securityContext->getToken()->getUser();
  32.  
  33. if ( ($user instanceof UserInterface) && !($user->isActiveNow()) ) {
  34. $user->setLastActivityAt(new \DateTime());
  35. $this->userManager->updateUser($user);
  36. }
  37. }
  38. }
  39. }


Obsługa serwisu:
  1. activity_listener:
  2. class: %activity_listener.class%
  3. arguments: ["@security.token_storage", "@fos_user.user_manager"]
  4. tags:
  5. - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }


I potem to już tylko odpowiednie zapytanie czyli

  1. <?php
  2. use Doctrine\ORM\EntityRepository;
  3.  
  4. class UserRepository extends EntityRepository
  5. {
  6. public function getActive()
  7. {
  8. $delay = new \DateTime();
  9. $delay->setTimestamp(strtotime('2 minutes ago'));
  10. $qb = $this->createQueryBuilder('u')
  11. ->where('u.lastActivityAt > :delay')
  12. ->setParameter('delay', $delay)
  13. ;
  14. return $qb->getQuery()->getResult();
  15. }
  16. }



A jak chcesz mieć to w Twigu to:
Utwórz nową akcję w kontrolerze a w Twigu użyj: render(controller('nazwa')),
albo
Stwórz Helper dla Twiga http://symfony.com/doc/current/templating/..._extension.html
damianooo
Samo zapisanie następuje automatycznie w momencie zalogowania ?
Gdzie tutaj sprawdzasz czy użytkownik się zalogował ?
Serwis automatycznie nasłuchuje i wyłapuje zdarzenie zalogowania ?
Możesz mi to bardziej szczegółowo rozpisać ? Będę wdzięczny.

Chyba mam teraz dobrą okazję żeby zacząć w końcu pisać kod z użyciem serwisów - zawsze tak chciałem ale odkładałem to na później.

nospor
@kajti ale przeczytales w ogole tresc pytania? sesja jest w bazie danych. jedyne co trzeba zrobic to wyciagnac tylko stamtad dane. nie ma juz potrzeby tworzenia nowych pol dla usera
kajti
@nospor, chwilę w siebie zwątpiłem. Gdzie jest napisane iż sesje są trzymane w bazie danych ?
"Użytkowników przechowuję w bazie danych." - wydaje mi się że chodzi o tabelę users.
Symfony przecież domyślnie nie mają sesji w DB tylko trzeba skorzystać z PdoSessionHandler.

@damianooo, mój serwis wykrywa aktywność użytkownika i aktualizuje pole w bazie danych "lastActivityAt".

Cytat
Samo zapisanie następuje automatycznie w momencie zalogowania ?
Gdzie tutaj sprawdzasz czy użytkownik się zalogował ?

Podczas logowania po poprawnej walidacji następuje przekierowanie do jakieś akcji czyli aktywność więc nie potrzeba dodatkowego kodu.

Zapytanie w repozytorium sprawdza którzy użytkownicy wykonali jakąś aktywność w ciągu 2 minut.
nospor
@kajti wybacz, bylem swiecie przekonany ze tam bylo napisane sesje w bazie a nie userzy w bazie. Albo wiec autor edytowal to (a widze ze post byl edytowany) albo ja mam juz cholerne zwidy :/
damianooo
Chyba niekoniecznie mam takie dane zapisane w bazie smile.gif
Ale rozumiem że piszesz apropo FOSUserBundle ?
Ja FOSa nie używam u siebie dlatego będę musiał dopisać taką funkcjonalność.

Mój obiekt User wygląda następująco:

  1. class User implements AdvancedUserInterface, \Serializable {
  2. private $id;
  3. private $username;
  4. private $email;
  5. private $password;
  6. private $plainPassword;
  7. private $shortname;
  8. private $status;
  9. private $priority;
  10. private $accountNonExpired = true;
  11. private $accountNonLocked = true;
  12. private $credentialsNonExpired = true;
  13. private $enabled = false;
  14. private $roles;
  15. private $actionToken;
  16. private $registerDate;
  17. private $avatar;





@nospor - był edytowany ale nie pisałem tam nic o sesji smile.gif ...
nospor
Tu masz wersje bez FOs
http://stackoverflow.com/questions/2109668...in-active-users
bardzo podobna
kajti
@nospor, zdarza się najlepszym Lkingsmiley.png

@damianooo, a po co ?
Dorzuć sobie pole do aktualizacji daty i kilka funkcji w encji czyli:
  1. /**
  2. * Date/Time of the last activity
  3. *
  4. * @var \Datetime
  5. * @ORM\Column(name="last_activity_at", type="datetime", nullable=true)
  6. */
  7. protected $lastActivityAt;
  8.  
  9. public function setLastActivityAt($lastActivityAt)
  10. {
  11. $this->lastActivityAt = $lastActivityAt;
  12. }
  13.  
  14. /**
  15. * @return \Datetime
  16. */
  17. public function getLastActivityAt()
  18. {
  19. return $this->lastActivityAt;
  20. }
  21.  
  22. /**
  23. * @return Bool Whether the user is active or not
  24. */
  25. public function isActiveNow()
  26. {
  27. // Delay during wich the user will be considered as still active
  28. $delay = new \DateTime('2 minutes ago');
  29. return ( $this->getLastActivityAt() > $delay );
  30. }


zrób update w bazie danych.
Musisz sobie przerobić serwis bo jeżeli nie korzystasz z FOSa to nie masz UserManagerInterface czyli z konstruktora wypada Ci jeden argument.
W funkcji onCoreController
  1. $this->userManager->updateUser($user);

zastąp flushem i powinno być git
damianooo
ok dzięki chłopaki chyba już sobie poradzę - ale dokończę chyba jutro bo trzeba wstać do pracy wink.gif

Ten link z przykładem bez FOSa co podesłał @nospor jest idealny do mojej aplikacji .

Twój @kajti kod też się przyda bo widzę że od wersji 2.6 Symfony trzeba conieco zmienić tak jak piszą na Stackoverflow -Twój kod już te zmiany posiada.

kajti
@damianooo, korzystałem dokładnie z tego co przesłał Ci @nospor z tym że to było x czasu temu i łatwiej mi było znaleźć to w repo smile.gif

Powodzenia !
nospor
Skoro temat juz rozwiazany to pozwole sobie odejsc troche od tematu

@kajti co cie sklonilo do uzywania FOSa?
kpt_lucek
Cytat(nospor @ 30.01.2017, 22:59:30 ) *
Skoro temat juz rozwiazany to pozwole sobie odejsc troche od tematu

@kajti co cie sklonilo do uzywania FOSa?


@nospor pozwolę sobie ze swojego przykładu
1. Gotowiec = mało pracy, wsparcie, bugi i feature ogrywa właściciel, testowane na bierząco przez comunity,
2. W wielu (nie we wszystkich) projektach mam logowanie po OAuth(2)/LDAP/CAS (HWIOAuth) itp. - do tego można znaleźć ciekawe paczki które niejako są przygotowane do pracy z FOSUB,
3. Zewnętrzny lib (pokrywać się może z #1) - potrzebuję wymiany na coś innego, to wymieniam i dopinam tak, aby działało. Z mojej strony aplikacja bazuje na UserInterface dołączony do SF(2|3).

Można powodów wymienić zdecydowanie więcej, wszystko zależy od tego, jak wiele chcesz pisać sam.
Boshi
Również używam FOS. Instalujesz, konfigurujesz, masz gotowy system autoryzacji wink.gif
maly_swd
@nospor: Było napisane "sesję w bazie danych".
A co do FOSa - to fajne rozwiązanie, sam używam tego i po dokładnym zapoznaniu uważam za genialne rozwiązanie smile.gif
nospor
Dziekuje za opinie o FOS. Teraz moja:

Tylko, ze jak trzeba cos dodac niestandardowego do FOSa to trzeba sie naczytac nameczyc itp. FOS wydaje sie byc ok dla tego co przewidzieli. Gdy chcesz zrobic cos wlasnego w FOS to nagle sie okazuje ze musisz sie nameczyc jeszcze wiecej jakbys robil bez FOSa. To mnie sklonilo do powiedzenia dla FOS: nie, dziekuje, nie skorzystam.
Standardowy user bez FOSa nie wydaje sie w ogole skomplikowany i bez problemu mozesz dodac wlasne rzeczy

Cytat
@nospor: Było napisane "sesję w bazie danych".
No i mi sie kurcze tak wydawalo
kajti
@nospor, co masz na myśli mówiąc coś własnego? jakiś przykład poproszę
nospor
Teraz mi trudno na poczekaniiu wymyslec, ale no np:
zmiana stylu jakiegos elementu czy czegos takiego. Jak przegladalem wczesniej net to ludzie czesto sie skarzyli, by moc cos zmienic to musisz sie sporo nameczyc i podawali przyklady. Teraz naprawde nie pamietam.
Ponadto FOS tworzy cala mase pol, ktorych my nigdy nie bedziemy potrzebowali i od tak sobie beda wisialy w tabeli
maly_swd
@nospor: Jest tak jak piszesz, jeśli trzeba zrobić coś niestandardowego i nie przeczytasz dokumentacji (nie zobaczysz w kod FOSa) - to faktycznie, kiepsko to wygląda.
Ja osobiście poświęciłem dzień na czytanie dokumentacji i zrozumienie kodu (przeglądałem całego bundla). I zrobienie czegoś niestandardowego to pestka (oczywiście jak znasz zasady jakimi kieruje się symfony).
Warto abyś jeszcze raz "przysiadł się" i może Ci się spodoba biggrin.gif
kajti
@nospor, ze stylami to raczej nie problem bo wystarczy nadpisać pliki w Resources. Kiedyś miałem przypadek że musiałem dodać coś swojego w rejestracji ale wystarczyło nadpisać kontroler i poszło łatwo i przyjemnie.

Cytat
Ponadto FOS tworzy cala mase pol, ktorych my nigdy nie bedziemy potrzebowali i od tak sobie beda wisialy w tabeli

To jest jakiś argument, ale według mnie ten bundle jest na tyle uniwersalny że można śmiało przymknąć oko wink.gif
Boshi
Customizacja Fosa to pestka w porównaniu z sonatą. Tego diabeł z widłami się boi tknąć biggrin.gif
kajti
@Boshi, zgadzam się w pełni.

Prościej zrobić coś własnego, niż się z tym męczyć wink.gif Tym bardziej że gridy można w łatwy sposób tworzyć przez np. APYDataGridBundle
nospor
To ze FOS jest prostrzy od Sonata nie zmienia faktu, ze nadal trzeba sie z nim uzerac przy dodatkowych rzeczach wink.gif
I nie chce przymykac oko na cala mase pol ktora tworzy bo tak wink.gif

No ale kazdy ma swoje zdanie, chcialem po prostu poznac wasze. smile.gif
Boshi
@Kajti, działa to dobrze w SF3? bo szczerze to mnie szlag trafia jak mam coś w tej sonacie zmienić a jedynie co potrzebuje to crudy. Mimo swoich zalet SF leży pod względem jakiś helperów do panelu admina. Pisząc w Yii2 panel to

własny template, lub jakiś adminLTE + własne widoki z crudami generowane przez widgety. Chcę coś dodać? spoko nie ma problemu, coś usunąć, coś zmienić, wszystko wiem gdzie jest i jak działa. W Sonacie najpierw szukam po necie nic nie ma, potem próbuję coś sam- nie działa, aż w końcu po tyg w końcu udaje się coś ogarnąć po 500 próbie..
Teoretycznie w SF też mozna generować crudy przez domyślny generator, ale niestety tabele trzeba stylizować we własnym zakresie, do tego wyszukiwarka, sortowania itd.

Mam nadzieję, że EasyAdmin w końcu będzie na tyle rozbudowany, że będzie można go swobodnie używac.
kajti
@Boshi, dla SF3 APYgrid ma jeszcze devkę ( https://packagist.org/packages/apy/datagrid...le#dev-symfony3 ), ale używałem ostatnio w projekcie i nie widziałem jakiś większych baboli. W yii2 rzeczywiście gridy są fajnie rozwiązane bo mamy columns i deklarujemy kolumny które mają się wyświetlać a jak chcemy coś "bardziej" to używamy funkcji anonimowej do value. W sumie to samo da się osiągnąć przez APYgrid ale jest po prościej.

W sumie można pokusić się o jakąś klasę abstrakcyjną dla SF3 np AbstractCrudController i jakoś to fajnie powiązać - tutaj jest przykład, co prawda trochę inaczej ale zamysł jest dobry ( https://github.com/stanlemon/crud-bundle )
kpt_lucek
@nospor
FOS w ostatnich dniach (nie wiem, ze 2 tygodnie temu?) wywalił część tych pól o których mówisz, a z tego co wiem, to mają kolejne "ubyć".

Poza tym, nie wiem jak bardzo skomplikowaną logikę chciałbyś dodać do użytkownika (customy o których wspominałeś), ale nie wierzę aby to był problem. #RealLifeExample proszę smile.gif
nospor
Cytat
#RealLifeExample proszę
Bij zabij, nie podam...Pol roku temu czytajac rozne opinie na necie na temat FOS zrezygnowalem ostatecznie z tego wlasnie powodu, ze ciezko potem cos dostosowac pod wlasne specyficzne potrzeby. Ten problem bardzo czesto sie pojawial na necie.
Teraz robie wszystko bez FOS i nie mam zadnych problemow z niczym wiec za bardzo nie mam co powiedziec madrego sad.gif
Boshi
A spróbuj sobie na nowym projekcie to skonfigurować, dostosować cssy pod siebie itd. Wtedy ocenisz dokłądniej (bo z tego co zrozumiałem to tylko czytałeś o FOS)

nospor
@Boshi ale to do mnie czy do kogos innego? Bo tak nie wynika za dokladnie z konktekstu wink.gif
Jesli to do mnie to naprawde nie mam czasu by teraz w srodku projektu dodawac sobie klopotu w postaci FOS wink.gif
Boshi
Ciebie, ciebie. Mówię w nowym projekcie jak będziesz miał chwilę czasu, ot tak dla sprawdzenia smile.gif
nospor
Haha, wybacz, jak napisales "na nowym projekcie" to nie wiem czemu zrozumialem ze masz na mysli ten nowy ktory zaczalem... smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.