security.yml: (fragment)

  1.  
  2. firewalls:
  3. login_firewall:
  4. pattern: ^/login$
  5. anonymous: ~
  6. secured_area:
  7. pattern: ^/
  8. form_login:
  9. login_path: login
  10. check_path: login_check
  11. default_target_path: /login_check
  12. logout:
  13. path: /logout
  14. target: /login
  15.  



routing.yml:

  1.  
  2. login:
  3. pattern: /login
  4. defaults: { _controller: AcmeLogowanieBundle:Default:login }
  5.  
  6. login_check:
  7. pattern: /login_check
  8. defaults: { _controller: AcmeLogowanieBundle:Default:logintrue }
  9.  
  10. logout:
  11. pattern: /logout
  12. defaults: { _controller: AcmeLogowanieBundle:Default:login }
  13.  
  14. dodaj:
  15. pattern: /dodaj
  16. defaults: { _controller: AcmeLogowanieBundle:Default:dodaj }
  17.  




metoda dodaj Kontrolera:

  1.  
  2. public function dodajAction(){
  3.  
  4. $user = new User();
  5. $factory = $this->container->get('security.encoder_factory');
  6. $encoder = $factory->getEncoder($user);
  7. $pwd = $encoder->encodePassword('kowalski', $user->getSalt());
  8. $user->setUsername('kowalski');
  9. $user->setEmailAddress('exampleas@example.com');
  10. $user->setRoles('ROLE_SUPER_ADMIN');
  11. $user->setSalt($user->getSalt());
  12. $user->setPassword($pwd);
  13.  
  14. $em = $this->getDoctrine()->getEntityManager();
  15. $em->persist($user);
  16. $em->flush();
  17.  
  18. return $this->render('AcmeLogowanieBundle:Default:dodano.html.twig');
  19. }
  20.  




Opis problemu:

Jeśli przy obecnej konfiguracji security.yml wywołam adres:

  1. 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:

  1. <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:

  1. 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:

  1.  
  2.  
  3. firewalls:
  4. login_firewall:
  5. pattern: ^/
  6. anonymous: ~
  7. secured_area:
  8. pattern: ^/
  9. form_login:
  10. login_path: login
  11. check_path: login_check
  12. default_target_path: /login_check
  13. logout:
  14. path: /logout
  15. target: /login
  16.  



, 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:

  1.  
  2.  
  3. Impossible to access an attribute ("username") on a NULL variable ("") in AcmeLogowanieBundle:Default:index.html.twig at line 2
  4.  



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:

  1.  
  2. pattern: ^/login$
  3.  



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:

  1.  
  2. pattern: ^/login$
  3.