firewalls: login_firewall: pattern: ^/login$ anonymous: ~ secured_area: pattern: ^/ form_login: login_path: login check_path: login_check default_target_path: /login_check logout: path: /logout target: /login
routing.yml:
login: pattern: /login defaults: { _controller: AcmeLogowanieBundle:Default:login } login_check: pattern: /login_check defaults: { _controller: AcmeLogowanieBundle:Default:logintrue } logout: pattern: /logout defaults: { _controller: AcmeLogowanieBundle:Default:login } dodaj: pattern: /dodaj defaults: { _controller: AcmeLogowanieBundle:Default:dodaj }
metoda dodaj Kontrolera:
public function dodajAction(){ $user = new User(); $factory = $this->container->get('security.encoder_factory'); $encoder = $factory->getEncoder($user); $pwd = $encoder->encodePassword('kowalski', $user->getSalt()); $user->setUsername('kowalski'); $user->setEmailAddress('exampleas@example.com'); $user->setRoles('ROLE_SUPER_ADMIN'); $user->setSalt($user->getSalt()); $user->setPassword($pwd); $em = $this->getDoctrine()->getEntityManager(); $em->persist($user); $em->flush(); return $this->render('AcmeLogowanieBundle:Default:dodano.html.twig'); }
Opis problemu:
Jeśli przy obecnej konfiguracji security.yml wywołam adres:
http://localhost/Logowanie3/web/app_dev.php/login
Wyświetli się formularz logowania. Po wprowadzeniu poprawnych danych do formularza i wysłaniu go, dostajemy informację o poprawnym zalogowaniu użytkownika do aplikacji.
Zrobiłem sobie dodatkową metodę "dodaj" którą umieściłem w kontrolerze. Metoda ta dodaje mi nowych użytkowników do bazy z zakodowanym hasłem.
Jeśli przy obecnych ustawieniach wywołam metodę dodaj z adresu:
<a href="http://localhost/Logowanie3/web/app_dev.php/dodaj" target="_blank">http://localhost/Logowanie3/web/app_dev.php/dodaj</a>
Nastąpi automatyczne przejście do strony:
http://localhost/Logowanie3/web/app_dev.php/login
a użytkwnik nie zostanie dodany do bazy danych. Jeśli zmienię security.yml usuwając wzorzec login$ czyli:
firewalls: login_firewall: pattern: ^/ anonymous: ~ secured_area: pattern: ^/ form_login: login_path: login check_path: login_check default_target_path: /login_check logout: path: /logout target: /login
, metoda zadziała i doda użytkownika, ale poprzednia funkcjonalność logowani aużytkowników do bazy będzie działać błędnie powodując np. taki wyjątek:
Impossible to access an attribute ("username") on a NULL variable ("") in AcmeLogowanieBundle:Default:index.html.twig at line 2
username nie jest przekazany.
Najgorsze jest to, że w pewnych przypadkach logowanie powoduje dodanie nowego użytkownika do bazy co mnie bardzo niepokoi dry.gif
W związku z powyższym prosiłbym o wyjaśnienie zasady działania pattern.
1. Czy np. jeśli w security mam:
pattern: ^/login$
to jak rozumiem ma to związek z pattern w routing.yml tylko jaki?
2. Jak zmienić kod aby obie funkcjonalności, czyli zarówno logowanie jak i dodawanie nowych użytkowników działało bez konieczności dodawania lub usuwania powyższego kawałka kodu ?
EDIT:
coś się stało z tym tematem, nie można była odpowiadać bo wyskakiwały błędy: chyba już można.
3. Okazuje się że w tym przykładzie nowego użytkownika do bazy danych może dodać tylko i wyłącznie użytkownik zalogowany i jest to logiczne podejście.
Jednak przydałoby się wytłumaczenie tego kawałka kodu:
pattern: ^/login$