• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Symfony 2.5 Form Login zawsze błędne hasło ?

+1 głos
67 wizyt
pytanie zadane 11 kwietnia 2018 w PHP, Symfony, Zend przez Neronys Bywalec (2,110 p.)

Witam,

Panowie przy stworzeniu formularza logowania w moim projekcie przy użyciu SecurityContextInterface.

Dane ładowane do bazy przy użyciu DataFixtures przy użyciu arrayki więc co leci do bazy wiem.

Mam następujący problem:

Przy wpisaniu poprawnych danych logowania na przykładowego usera za każdym jednym razem dostaje zwrotkę "Bad Credentials" oraz do widoku nie wskakuje ostatnio logowany user

Proszę o jakąś wskazówkę.

security.yml

security:
    encoders:
      Common\UserBundle\Entity\User:
        algorithm: bcrypt

    role_hierarchy:
            ROLE_EDITOR:    ROLE_USER
            ROLE_ADMIN:       [ROLE_EDITOR, ROLE_USER]
            ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_EDITOR, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]


    providers:
      blog_users:
          entity:
            class: CommonUserBundle:User
            property: username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        blog_security:
            pattern: ^/
            anonymous: ~
            form_login:
              check_path: _check_path
              login_path: blog_login
              default_target_path: blog_index
              username_parameter: login[username]
              password_parameter: login[password
            logout:
              path: _logout
              target: blog_index

    access_control:
            #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
            - { path: ^/account-settings, roles: ROLE_USER }
            - { path: ^/admin-panel, roles: ROLE_EDITOR }

 

UserFixtures

<?php


namespace Common\UserBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Common\UserBundle\Entity\User;

class UserFixtures extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function getOrder() {
        return 0;
    }

    public function load(ObjectManager $manager) {

        $usersList = array(
            array(
                'nick' => 'adas_no',
                'email' => 'anowak@test.pl',
                'password' => '123',
                'role' => 'ROLE_USER'
            ),
            array(
                'nick' => 'kowal',
                'email' => 'j.kowalski@test.pl',
                'password' => '123',
                'role' => 'ROLE_EDITOR'
            ),
            array(
                'nick' => 'anowak',
                'email' => 'anowakik@test.pl',
                'password' => '123',
                'role' => 'ROLE_ADMIN'
            ),
            array(
                'nick' => 'szymon',
                'email' => 'szymon@test.pl',
                'password' => '123',
                'role' => 'ROLE_SUPER_ADMIN'
            ),
            array(
                'nick' => 'adas',
                'email' => 'nowy@test.pl',
                'password' => '123',
                'role' => 'ROLE_USER'
            ),
        );

        $encoderFactory = $this->container->get('security.encoder_factory');


        foreach($usersList as $userDetalis){
            $User = new User();

            $password = $encoderFactory->getEncoder($User)->encodePassword($userDetalis['password'], null);

            $User->setUsername($userDetalis['nick'])
                ->setEmail($userDetalis['email'])
                ->setPassword($password)
                ->setRoles(array($userDetalis['role']))
                ->setEnabled(true);

            $manager->persist($User);
        }

        $manager->flush();

    }
}

routing.yml dla bundla USER

common_user:
  resource: "@CommonUserBundle/Controller/"
  type: annotation
  prefix: /

_check_path:
  path: /login-check

_logout:
  path: /logout

Widok form

{% if loginError is defined and loginError is not null %}
        <div class="notification blog">{{ loginError.message }}</div>
    {% endif %}

    <div class="login-register two-cols">
        <div class="col col-bdr">

            <h2 class="strong">Logowanie</h2>

            <form class="login-form" action="{{ path('_check_path') }}" method="post">

                <div class="form-row">
                    <label for="login" class="required">Login</label>
                    <input id="login" type="text" name="_username" value="{{ userName }}">
                </div>

                <div class="form-row">
                    <label for="passwd" class="required">Hasło</label>
                    <input id="passwd" type="text" name="_password">
                </div>

                <label class="checkbox remember">
                    <input type="checkbox"> Zapamiętaj mnie
                </label>

                <button class="btn-green submit">Zaloguj</button>
            </form>

            <div class="remember-pass-form">
                <h2 class="strong">Przypomnij hasło</h2>

loginController

<?php

namespace Common\UserBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\HttpFoundation\Request;



class LoginController extends Controller
{
    /**
     * @Route(
     *     "/login",
     *     name="blog_login"
     * )
     * @Template()
     */
    public function loginAction(Request $request)
    {
        $Session = $request->getSession();

        if($request->attributes->has(SecurityContextInterface::AUTHENTICATION_ERROR)){
            $loginError = $request->attributes->get(SecurityContextInterface::AUTHENTICATION_ERROR);
        }else{
            $loginError = $Session->remove(SecurityContextInterface::AUTHENTICATION_ERROR);
        }

        $userName = $Session->get(SecurityContextInterface::LAST_USERNAME);


        return array(
            'userName' => $userName,
            'loginError' => $loginError
        );
    }

}

 

2 odpowiedzi

0 głosów
odpowiedź 11 kwietnia 2018 przez UltraSF Stary wyjadacz (10,720 p.)
A gdzie input z csrf tokenem ?
komentarz 11 kwietnia 2018 przez Neronys Bywalec (2,110 p.)
dopiero zaczynam z symfony, nie zrealizowałem zabezpieczenia na CSRF. Jesteś w stanie jakoś naprowadzić w jaki sposób można było by zdebugować te BAD CREDENTIALSY ?
komentarz 11 kwietnia 2018 przez UltraSF Stary wyjadacz (10,720 p.)
Wątpię że to to, ale masz               password_parameter: login[password <- brakuje tu ]

ale wątpię że to pomoże ale może xd
komentarz 11 kwietnia 2018 przez UltraSF Stary wyjadacz (10,720 p.)
W bazie hasła są zaszyfrowane poprawnie ?
komentarz 11 kwietnia 2018 przez Neronys Bywalec (2,110 p.)

Dzięki UltraSF za szybką odpowiedź.

niestety zamknięcie "]" nie pomogło a passy w bazie są szyfrowane, zerknij na zdjęcie:

 

Czytałem że to może dlatego bo hash z bcrypta nie mieści się w polu password o dlugości 64 ale zmieniłem w encji na 512xD i puściłem jeszcze raz doctrine:fixtures:load, poszło bez problemu.

komentarz 11 kwietnia 2018 przez UltraSF Stary wyjadacz (10,720 p.)
Dziwnę bo w dokumentacji jest pokazane, aby password miało długość 64, no cóż warto wiedzieć :)
komentarz 11 kwietnia 2018 przez Neronys Bywalec (2,110 p.)
gdybyś miał jakiś pomysł to będę wdzięczny, bez tego nie ruszę dalej z projektem, co prawda robię to dla siebie ale jednak chciałbym tego CMS'a dokończyć xD
komentarz 11 kwietnia 2018 przez UltraSF Stary wyjadacz (10,720 p.)
Dodaj csrf token, wydaje mi się że to pomoże, a jak nie to zawsze bd już go miał, a to dwie linijki kodu jedna w security a druga w formularzu xd
0 głosów
odpowiedź 11 kwietnia 2018 przez Ehlert Mędrzec (165,060 p.)
  1. Skoro się uczysz Symfony, (zakładam że nie masz projektu, w którym jest 5000 userów i limitowany budżet) to czemu wersja 2.5? Obecnie używa się 3.4, 4.0, a zaraz, 4.1. Czyżby to conajmniej dziwne przeświadczenie, że zacząć od starszej wersji będzie lepiej?
  2. Na początek lepiej ogarniać jak działają kontrolery, encje, cały Doctrine, może budowanie jakiegoś api. Skoro chcesz logowanie skorzystaj z Fosuserbundle.
  3. Jeśli koniecznie własne logowanie to napisz klasę rozszerzającą AbstractGuardAuthenticator. 
komentarz 12 kwietnia 2018 przez Neronys Bywalec (2,110 p.)
2.5 z racji na to że kurs który realizuje niestety opiera się na wersji 2.5. Niestety ten kurs jest trochę do bani i gość nie pokazuje wszystkiego co robi. Lubię video kursy bo w każdej chiwli mogę wrócić przy pisaniu projektu do któregoś odcinka i zobaczyć co można zrobić, nie mówię o symfony bo rozbierzność wersji powoduje że kurs na 2.5 jest trochę bezużyteczny ? jeśli się mylę to proszę o korektę.

Fosuserbundle - zerknę

 

Nie musi być własne logowanie po co wymyślać koło na nowo. Chcę tylko zapoznać się i zrozumieć od środka jak takie pakiety mogą działać poprzez na początku napisanie swoich. Ale bez pomocy kursu będzie ciężko a spam co chwile na forum to nie jest dobry pomysł.

Dlatego chciałem tylko zapytać czy nie widzicie jakiegoś możliwego błędu w moim kodzie, jesli już w tym siedzicie jakiś czas to SecurityContextInterface na pewno kojarzycie i wiecie co jest potrzebne do prawidłowego działania.

Podobne pytania

0 głosów
2 odpowiedzi 76 wizyt
pytanie zadane 23 kwietnia w PHP, Symfony, Zend przez hiper007 Stary wyjadacz (10,860 p.)
0 głosów
0 odpowiedzi 23 wizyt
0 głosów
1 odpowiedź 56 wizyt
pytanie zadane 2 stycznia w JavaScript, jQuery, AJAX przez AbuNabi666 Nowicjusz (120 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

64,233 zapytań

110,623 odpowiedzi

231,914 komentarzy

46,972 pasjonatów

Przeglądających: 235
Pasjonatów: 14 Gości: 221

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...