Symfony3:登录时如何更改角色

时间:2017-05-01 12:32:09

标签: php symfony

我想在登录时更改角色,所以我在控制器中有一个表单来登录我和我的用户类的提供程序,但我真的迷路了。我一直在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'],就像我登录时的意图一样

0 个答案:

没有答案