我想在登录时更改角色,所以我在控制器中有一个表单来登录我和我的用户类的提供程序,但我真的迷路了。我一直在symfony网站上看几个tutoriel,但我仍然不知道如何做到这一点。所以在我登录之前,我在symfony工具栏上被认证为anon。但是当我登录时,我没有通过身份验证,但我在工具栏上看到了我的用户名。你能告诉我我需要看什么?我只是看不清楚如何验证,我一直在寻找... 这是我的控制器里面的表格:
public function indexAction(Request $request)
{
$player = new Player;
$form = $this->createFormBuilder($player)
->add('email', TextType::class, array('label' => 'Email :'))
->add('password', PasswordType::class, array('label' => 'Mot de passe :'))
->add('login', SubmitType::class, array('label' => 'Login'))
->getForm();
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid())
{
$password = $form['password']->getData();
$email = $form['email']->getData();
$encoded_pass = sha1($form['password']->getData());
$date = date_create();
/*
Recherche dans la base de données si les différents éléments entrés
sont présents afin de connecter la personne
*/
$player = $this->getDoctrine()
->getRepository('AppBundle:Player')
->findOneByEmail($email);
$pass_check = $this->getDoctrine()
->getRepository('AppBundle:Player')
->findByPassword($encoded_pass);
if(!$player)
{
return $this->redirectToRoute('registration');
}
else
{
$pseudo = $this->getDoctrine()
->getRepository('AppBundle:Player')
->findOneByEmail($email)->getPseudo();
/* Met à jour la date de connection */
$player->setDateLog($date);
/* Entre les différents élements dans la base */
$em = $this->getDoctrine()->getManager();
$em->persist($player); // prépare l'insertion dans la BD
$em->flush(); // insère dans la BD
$token = new UsernamePasswordToken($player, $player->getPassword(), "main", $player->getRoles());
$event = new InteractiveLoginEvent(new Request(), $token);
$this->container->get("event_dispatcher")->dispatch("security.interactive_login", $event);
$this->container->get("security.token_storage")->setToken($token);
return $this->redirectToRoute('accueil', array('pseudo' => $pseudo));
}
}
return $this->render('Sko/menu.html.twig', array('form' => $form->createView()));
// En plus renvoyer la balise
}
然后我有我的提供者:
<?php
namespace AppBundle\Security;
use AppBundle\Entity\Player;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
class PlayerProvider implements UserProviderInterface
{
protected $doctrine;
public function __construct(\Doctrine\Bundle\DoctrineBundle\Registry $doctrine){
$this->doctrine = $doctrine;
}
public function loadUserByUsername($username)
{
// make a call to your webservice here
$player = new Player();
$player = $this->doctrine
->getRepository('AppBundle:Player')
->findOneByPseudo($username);
// pretend it returns an array on success, false if there is no user
if ($player) {
$password = $player->getPassword();
$salt = $player->getSalt();
$roles = $player->getRoles();
return $player;
}
throw new UsernameNotFoundException(
sprintf('Username "%s" does not exist.', $username)
);
}
public function refreshUser(UserInterface $user)
{
if (!$user instanceof Player) {
throw new UnsupportedUserException(
sprintf('Instances of "%s" are not supported.', get_class($user))
);
}
return $this->loadUserByUsername($user->getPseudo());
}
public function supportsClass($class)
{
return Player::class === $class;
}
}
?>
感谢您的帮助
编辑:在Symfony Profiler中,我的角色是['ROLE_USER'],就像我登录时的意图一样