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.
#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é.
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...
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.
<?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.