Skip to content
Advertisement

Symfony3 Custom User Provider doesn’t work

I tried to implement everything per Symfony documentation but authentication seems to not work at all. Take a look at what I exactly did:

security.yml

security:
    encoders:
        AppBundleEntityStUser:
            algorithm: bcrypt
            cost: 12

    providers:
        our_db_provider:
            entity:
                class: AppBundle:Entity:StUser

    firewalls:
        user_secured_area:
            pattern:   ^/([a-z]{2})/account
            provider: our_db_provider
            form_login:
                login_path: login
                check_path: login_check
                csrf_token_generator: security.csrf.token_manager
        default:
            anonymous: ~
            http_basic: ~

StUser.php entity

namespace AppBundleEntity;

class StUser implements UserInterface
{
    private $id;
    private $firstName;
    private $lastName;
    private $password;
    private $username;
    private $isAdmin = '0';
    private $confirmed;
    private $created = 'CURRENT_TIMESTAMP';
    private $status = '1';

    public function getId()
    {
        return $this->id;
    }

    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    public function getFirstName()
    {
        return $this->firstName;
    }

    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    public function getLastName()
    {
        return $this->lastName;
    }

    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    public function getPassword()
    {
        return $this->password;
    }

    public function setUsername($username)
    {
        $this->username = $username;

        return $this;
    }

    public function getUsername()
    {
        return $this->username;
    }

    public function setIsAdmin($isAdmin)
    {
        $this->isAdmin = $isAdmin;

        return $this;
    }

    public function getIsAdmin()
    {
        return $this->isAdmin;
    }

    public function setConfirmed($confirmed)
    {
        $this->confirmed = $confirmed;

        return $this;
    }

    public function getConfirmed()
    {
        return $this->confirmed;
    }

    public function setCreated($created)
    {
        $this->created = $created;

        return $this;
    }

    public function getCreated()
    {
        return $this->created;
    }

    public function setStatus($status)
    {
        $this->status = $status;

        return $this;
    }

    public function getStatus()
    {
        return $this->status;
    }

    /* ==== Additional =================================================== */
    public function __construct($username, $password, $salt, array $roles)
    {
        $this->username = $username;
        $this->password = $password;
        /* $this->salt = $salt; */
        /* $this->roles = $roles; */
    }

    public function getRoles()
    {
        return null;
    }

    public function getSalt()
    {
        return null;
    }

    public function eraseCredentials()
    {

    }
}

UserRepository.php repository:

namespace AppBundleRepository;

use SymfonyBridgeDoctrineSecurityUserUserLoaderInterface;
use DoctrineORMEntityRepository;

class UserRepository extends EntityRepository implements UserLoaderInterface
{
    public function loadUserByUsername($username)
    {
        return $this->createQueryBuilder('u')
            ->where('u.username = :username OR u.email = :email')
            ->setParameter('username', $username)
            ->setParameter('email', $username)
            ->getQuery()
            ->getOneOrNullResult();
    }
}

AccountController.php

namespace AccountBundleController;

use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;

class AccountController extends Controller
{
    /**
     * @Route("{_lang}/login", name="login", requirements={"_lang": "pl"})
     */
    public function loginAction(Request $request, $_lang = '')
    {
        $helper = $this->get('security.authentication_utils');
        $error = $helper->getLastAuthenticationError();

        var_dump( $error );

        return $this->render('account/login.html.twig', array(
            'projects' => "",
            'lang' => "pl",
            'allLangs' => "",
            'mainLang' => "",
            'meta_title' => "test",
            'meta_description' => "",
            'meta_keywords' => "",
            'meta_robots' => "",
            'image_src' => "",
            'social_title' => "",
            'social_description' => "",
            'social_url' => "",
            'aaaa' => $helper,

            /* 'last_username' => $lastUsername,
            'error'         => $error, */
        ));
    }
}

login.html.twig view

{% block body %}
    <form action="{{ path('login', {'_lang': lang}) }}" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="_username" value="" />

        <label for="password">Password:</label>
        <input type="password" id="password" name="_password" />
        
        <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">

        <button type="submit">login</button>
    </form>
{% endblock %}

And nothing happens, $helper and $error are empty / null, nothing I can find in logs. What I missed. Thanks in advance.

Advertisement

Answer

I tried that but without success. It looks like any custom code is never called.

I’ve updated security.yml (when I set anonymous: ~, then it allows users to open for exampple account page without authorization):

security:
    encoders:
        AppBundleEntityStUser:
            algorithm: bcrypt
            cost: 12

    providers:
        our_db_provider:
            entity:
                class: AppBundle:StUser

    firewalls:
        user_secured_area:
            pattern:   ^/([a-z]{2})/account
            # anonymous: ~
            provider: our_db_provider
            form_login:
                login_path: login
                check_path: login_check
                csrf_token_generator: security.csrf.token_manager
        default:
            anonymous: ~
            http_basic: ~

and also I’ve updated User entity:

StUser.orm.yml entity:

AppBundleEntityStUser:
    type: entity
    table: st_user
    repositoryClass: AppBundleRepositoryUserRepository
    indexes:
        status_username_password:
            columns:
                - status
                - username
                - password
        status_is_admin_username_password:
            columns:
                - status
                - is_admin
                - username
                - password
    id:
        id:
            type: integer
            nullable: false
            options:
                unsigned: false
            id: true
            generator:
                strategy: IDENTITY
    fields:
        firstName:
            type: string
            nullable: true
            length: 255
            options:
                fixed: false
            column: first_name
        lastName:
            type: string
            nullable: true
            length: 255
            options:
                fixed: false
            column: last_name
        password:
            type: string
            nullable: true
            length: 255
            options:
                fixed: false
        username:
            type: string
            nullable: true
            length: 255
            options:
                fixed: false
        isAdmin:
            type: boolean
            nullable: false
            options:
                default: '0'
            column: is_admin
        confirmed:
            type: datetime
            nullable: true
        created:
            type: datetime
            nullable: false
            options:
                default: CURRENT_TIMESTAMP
        status:
            type: boolean
            nullable: false
            options:
                default: '0'
    lifecycleCallbacks: {  }
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement