logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Authentifier un utilisateur avec Synfomy [RÉSOLU]  (Lu 8017 fois)
le_gremz
Newseur

Profil challenge

Classement : 759/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 72

0xREDHEADS


Voir le profil WWW
« le: 03 Février 2015 à 16:13:13 »

Bon, j'ai déjà posé la question sur IRC donc les "RTFM", les "fais le c'est simple" , les "arrête de pomper des code fais le toi-même" j'en veut pas ici.
Pour info, j'ai lu les docs FR et EN du book de Symfony ainsi que le Cookbook. J'ai essayé d'utiliser les codes d'exemples mais ils ne "marche pas" (c'est peut-être moi qui les utilise mal...) bref.

J'ai une zone protégé par un firewall qui si l'utilisateur n'est pas loggué il est redirigé vers /login.

Code:
#app/config/security.yml
security:
    role_hierarchy:
        ROLE_TEACHER:     ROLE_STUDENT
        ROLE_ADMIN:       ROLE_TEACHER
    providers:
        main:
            entity: { class: Quizz\QuizzBundle\Entity\Users, property: username }


    encoders:
        Quizz\QuizzBundle\Entity\Users:
            algorithm:    sha512
            iterations: 5000
            encode_as_base64: true

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

        default:
            anonymous: ~
            http_basic: ~
            form_login:
                login_path: /login
                check_path: /login_check
            logout:
                path:   /logout

        login_firewall:
            pattern:   ^/login$
            anonymous: ~

    access_control:
            # require ROLE_ADMIN for /admin/*
            - { path: ^/admin/, roles: ROLE_ADMIN }
            # require ROLE_STUDENT for /student/*
            - { path: ^/student/, roles: ROLE_STUDENT }
            # require ROLE_TEACHER for /teacher/*
            - { path: ^/teacher/, roles: ROLE_TEACHER }
            # require Anon role for /login*
            - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            # require auth for /*
            - {path: ^/ , roles: ROLE_STUDENT }

Comme on peut le voir dans le fichier security.yml j'utilise ce qu'on appel un Entity Provider pour charger mes utilisateurs depuis ma base de données.

1er problème [Résolu]:
Lors de l'essai de connexion le mot de passe n'est pas valide et donc j'ai une erreur "Invalid Credentials."
[Solution] : Le champ de la base de données n'était pas assez grand et le mot de passe été tronqué.

2eme probleme :
L'authentification semble passer et l'erreur "Invalide credential" a disparue. Cependant une exception proc.
La BDD à déjà été interrogé.
Citation
Catchable Fatal Error: Argument 4 passed to Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct() must be of the type array, string given, called in /var/www/html/projetStage/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php on line 96 and defined
500 Internal Server Error - ContextErrorException


Je me suis penché sur ce problème en consultant l'API de symfony et il semble que ce soit un problème de role...

Citation
at ErrorHandler ->handleError ('4096', 'Argument 4 passed to Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken::__construct() must be of the type array, string given, called in /var/www/html/projetStage/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php on line 96 and defined', '/var/www/html/projetStage/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php', '36', array('user' => object(Users), 'credentials' => 'admin', 'providerKey' => 'default'))
in vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Token/UsernamePasswordToken.php at line 36   -

     *
     * @throws \InvalidArgumentException
     */
    public function __construct($user, $credentials, $providerKey, array $roles = array())
    {
        parent::__construct($roles);


Donc , oui j'ai lu les docs, oui j'ai cherché dans l'API pour essayer de voir pourquoi ça ne marche pas, j'ai cherché par moi même, ça fais 5 jours que je galère dessus !

Je demande juste qu'on me dise pourquoi cette erreur ce produit pour que je puisse la comprendre et la résoudre.
Merci d'avance à ceux qui auront la gentillesse de m'aider (pas comme certains...)



[EDIT]

Merci à K@ss d'avoir pris 5 minutes pour m'expliquer d'où venais le problème.Je poste donc la solution si ça intéresse des gens.
Symfony veut que vous lui passiez un tableau de rôles d'utilisateur quand vous utilisé le système d'authentification d'utilisateur.

Code:
<?php

namespace Quizz\QuizzBundle\Entity;

use 
Doctrine\ORM\Mapping as ORM;
use 
Symfony\Component\Security\Core\User\UserInterface;

class 
Users implements UserInterface , \Serializable{

    private 
$id;

    private 
$username;

    private 
$salt;

    private 
$password;

    private 
$email;

    private 
$isActive;

    private 
$roles;

    private 
$name;

    private 
$lastname;



    public function 
__construct()
    {
        
$this->isActive true;
    }

    
/**
     * Set roles
     *
     * @param string $roles
     * @return Users
     */
    
public function setRoles($roles)
    {
        
$this->roles $roles;

        return 
$this;
    }

    
/**
     * Get roles
     *
     * @return string
     */
    
public function getRoles()
    {
        return array(
$this->roles);
    }

}

Dans la fonction getRoles, il faut forcer la définition en array, return array($this->roles);.
Tout con au final, mais un peu déroutant quand ç'est une exception qui sort des tréfonds de symfony.
« Dernière édition: 03 Février 2015 à 17:40:50 par le_gremz » Journalisée

#OUI
Merci de ne pas me donner à manger après minuit, ni m'exposer à l'eau.
Forte tendance à casser ou détraquer tout ce que je touche...
Grand adorateur des rouquines. Manitou du discord "Rousses". Chasseur de rouquines aux yeux verts.
titoum76

Profil challenge

Classement : 138/54252

Membre Junior
**
Hors ligne Hors ligne
Messages: 58

magruith's son


Voir le profil
« #1 le: 04 Février 2015 à 21:10:46 »

C'est simple, arrête de pomper des code et fais le toi-même.
Journalisée

Ok
pixis
Administrateur

Profil challenge

Classement : 16/54252

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 664


Voir le profil WWW
« #2 le: 04 Février 2015 à 23:04:38 »

Merci pour la solution. Cependant, l'erreur était quand même super explicite :

Citation
must be of the type array, string given

A bon entendeur ...
Journalisée

Newbie Contest Staff :
Pixis
Statut :
Administrateur
Blog :
hackndo
Pages: [1]
  Imprimer  
 
Aller à: