• 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 ?

VPS Starter Arubacloud
+1 głos
218 wizyt
pytanie zadane 11 kwietnia 2018 w PHP przez Neronys Bywalec (2,090 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 (11,740 p.)
A gdzie input z csrf tokenem ?
komentarz 11 kwietnia 2018 przez Neronys Bywalec (2,090 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 (11,740 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 (11,740 p.)
W bazie hasła są zaszyfrowane poprawnie ?
komentarz 11 kwietnia 2018 przez Neronys Bywalec (2,090 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 (11,740 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,090 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 (11,740 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 Ekspert (212,630 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,090 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 380 wizyt
pytanie zadane 23 kwietnia 2019 w PHP przez hiper007 Stary wyjadacz (11,270 p.)
0 głosów
0 odpowiedzi 65 wizyt
pytanie zadane 15 maja 2019 w PHP przez Kacperhehe Bywalec (2,930 p.)
0 głosów
1 odpowiedź 240 wizyt
pytanie zadane 2 stycznia 2019 w JavaScript przez AbuNabi666 Nowicjusz (120 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...