Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] in-memory - logowanie
Forum PHP.pl > Forum > PHP > Frameworki
peter13135
Chcę zrobić logowanie, takie jak w "acme demo", czyli z ustalonymi w konfiguracji adminami.

Niby cały kod mam i wszystko działa... ale jak chcę przenieść to na moje potrzeby, to mi nie wychodzi.

Napiszę co po kolei robiłem :

1. Do swojego kontrolera dodałem 3 metody :
  1.  
  2. /**
  3.   * @Route("valuation/admin/login", name="admin_login")
  4.   * @Template()
  5.   */
  6. public function loginAction()
  7. {
  8. if ($this->get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
  9. $error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
  10. } else {
  11.  
  12. $error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR);
  13. }
  14.  
  15. return array(
  16. 'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME),
  17. 'error' => $error,
  18. );
  19. }
  20.  
  21. /**
  22.   * @Route("valuation/admin/login_check", name="_security_check")
  23.   */
  24. public function securityCheckAction()
  25. {
  26. // The security layer will intercept this request
  27. }
  28.  
  29. /**
  30.   * @Route("valuation/admin/logout", name="_demo_logout")
  31.   */
  32. public function logoutAction()
  33. {
  34. // The security layer will intercept this request
  35. }

oraz taką linijkę na początek :
  1. use JMS\SecurityExtraBundle\Annotation\Secure;


Są one skopiowane z przykładu Acme

2.Skopiowałem templatke login.html.twig do swojego bundla
3. Nieco zmodyfikowałem plik security.yml
  1. security:
  2. encoders:
  3. Symfony\Component\Security\Core\User\User: plaintext
  4.  
  5. role_hierarchy:
  6. ROLE_ADMIN: ROLE_USER
  7. ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
  8.  
  9. providers:
  10. in_memory:
  11. users:
  12. user: { password: userpass, roles: [ 'ROLE_USER' ] }
  13. admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
  14.  
  15. firewalls:
  16. dev:
  17. pattern: ^/(_(profiler|wdt)|css|images|js)/
  18. security: false
  19.  
  20. login:
  21. pattern: ^valuation/admin/login$
  22. security: false
  23.  
  24. secured_area:
  25. pattern: ^/valuation/admin/
  26. form_login:
  27. check_path: valuation/admin/login_check
  28. login_path: valuation/admin/login
  29. logout:
  30. path: valuation/admin/logout
  31. target: valuation/
  32. #anonymous: ~
  33. #http_basic:
  34. # realm: "Secured Demo Area"
  35.  
  36. access_control:
  37. #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
  38. #- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }



I to by było na tyle.

Wchodzę sobie do
Kod
valuation/admin/login


Formularz się wyświetla. Wpisuje dane, wysyłam i przenosi mnie do
Kod
valuation/admin/login_check

gdzie wyświetla się :
Kod
he controller must return a response (null given). Did you forget to add a return statement somewhere in your controller?
500 Internal Server Error - LogicException


Błąd jest zrozumiały, bo mój kontroler faktycznie nie zwraca wartości... ale podobno jakiś "security layer" ma to "obejść" i mimo to mnie zalogować.


Czy mogę prosić o podpowiedź gdzie znajduje się błąd ?
greycoffey
Może spróbuj zmienić front controller na app_dev.php, aby dowiedzieć się czegoś iwęcej. Na moje oko, metoda securityCheckAction() powinna zwracać jakiś boolean.
dragon7
Jak dla mnie to twoje loginAction nie zwraca obiektu odpowiedzi, tylko tablicę parametrów. Nie wiem czemu więc wyświetla ci się formularz logowania. Spróbuj zmienić na coś takiego
  1. return $this->render('AcmeSecurityBundle:Security:login.html.twig', array(
  2. 'last_username' => $session->get(SecurityContext::LAST_USERNAME),
  3. 'error' => $error
  4. ));
destroyerr
Cytat
First, be sure that you've defined the /login and /login_check routes correctly and that they correspond to the login_path and check_path config values.

Sprawdziles? Nie mam pewnosci, ale sprawdz czy to nie jest wina braku slasha w login_path i check_path.

@dragon7 przeciez korzysta z adnotacji Template dlatego zwraca tablice.
peter13135
@greycoffey
Pracuję na app_dev.php
Nie sądze, by ta metoda miała zwracać boolean. W examplu jest tak jak jest u mnie (tylko, że w examplu działa, a "moja wersja" nie wink.gif ). Poza tym, takie "może to, może tamto" do mnie nie dociera, jestem noobem w symfony, to pierwszy framework któego się uczę.
@dragon7
Bo jak sobię napiszę nad metodą
Kod
    /**
     * @Template()
     */

To wtedy generowana jest templatka, na podstawie nazwy metody, oraz tablicy zwracanej przez metodę.

@destroyerr

O Co właściwie chodzi ? tongue.gif

Ten kod, któy użyłem do logowania wkleiłem do pierwszego postu.
Są to właściwie 3 metody (któe są skopiowane z exampla acme) oraz plik security.yml (niezo zmodyfikowany). Nie mam pojęcia gdzie jeszcze powininem coś zmieniać.

metody zrobiłem - tak jak w pierwszym poście wkleiłem




edit://

Kurczę, działa. Błąd w pliku security.yml, brakowało slashy na początku wink.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.