Symfony 3:检查我是否已登录

时间:2017-04-30 16:34:28

标签: php symfony

我想检查一下当我使用表单登录时是否登录,但是我找不到我的anwser而且我不理解symfony网站上的教程...我试着遵循这个:{{ 3}},但我不想使用“HTTP基本身份验证”,而是使用我的symfony表单。

这是我的用户类:

<?php

namespace AppBundle\Entity;

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

/**
 * Player
 *
 * @ORM\Table(name="player")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\PlayerRepository")
 */
class Player implements UserInterface, \Serializable
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var string
     *
     * @ORM\Column(name="pseudo", type="string", length=255, unique=true)
     */
    private $pseudo;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, unique=true)
     */
    protected $email;

    /**
     * @var string
     *
     * @ORM\Column(name="password", type="string", length=255)
     */
    protected $password;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date_log", type="datetime", nullable=true)
     */
    private $dateLog;

    /**
     * @ORM\OneToMany(targetEntity="Characters", mappedBy="player")
     */
    private $characters;

    public function __construct(){
        $this->characters = new ArrayCollection();
    }
    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set pseudo
     *
     * @param string $pseudo
     *
     * @return Player
     */
    public function setPseudo($pseudo)
    {
        $this->pseudo = $pseudo;

        return $this;
    }

    /**
     * Get pseudo
     *
     * @return string
     */
    public function getPseudo()
    {
        return $this->pseudo;
    }

    /**
     * Set email
     *
     * @param string $email
     *
     * @return Player
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * Set password
     *
     * @param string $password
     *
     * @return Player
     */
    public function setPassword($password)
    {
        $this->password = $password;

        return $this;
    }

    /**
     * Get password
     *
     * @return string
     */
    public function getPassword()
    {
        return $this->password;
    }

    /**
     * Set dateLog
     *
     * @param \DateTime $dateLog
     *
     * @return Player
     */
    public function setDateLog($date_log)
    {
        $this->dateLog = $date_log;

        return $this;
    }

    /**
     * Get dateLog
     *
     * @return \DateTime
     */
    public function getDateLog()
    {
        return $this->dateLog;
    }

    /**
     * Set Characters
     *
     * @param array $characters
     *
     * @return Characters
     */
    public function setCharacters($characters)
    {
        $this->characters = $characters;

        return $this;
    }

    /**
     * Get characters
     *
     * @return array
     */
    public function getCharacters()
    {
        return $this->characters;
    }

    /**
     * Add character
     *
     * @param \AppBundle\Entity\Characters $character
     *
     * @return Player
     */
    public function addCharacter(\AppBundle\Entity\Characters $character)
    {
        $this->characters[] = $character;

        return $this;
    }

    /**
     * Remove character
     *
     * @param \AppBundle\Entity\Characters $character
     */
    public function removeCharacter(\AppBundle\Entity\Characters $character)
    {
        $this->characters->removeElement($character);
    }

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

    public function getSalt()
    {
        // you *may* need a real salt depending on your encoder
        // see section on salt below
        return null;
    }


    public function getRoles()
    {
        return array('ROLE_USER');
    }

    public function eraseCredentials()
    {
    }

    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->pseudo,
            $this->password,
            // see section on salt below
            // $this->salt,
        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->pseudo,
            $this->password,
            // see section on salt below
            // $this->salt
        ) = unserialize($serialized);
    }
}

然后我的登录表单(它工作正常,我无法检查是否有人连接):

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();
            
            $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();
                
                $player->setDateLog($date);
                
                $em = $this->getDoctrine()->getManager();
                $em->persist($player); 
                $em->flush(); // insère dans la BD
                return $this->redirectToRoute('accueil',  array('pseudo' => $pseudo));
            }
        }

        return $this->render('Sko/menu.html.twig', array('form' => $form->createView()));
        
    }

编辑:我不想编码我的密码,因为我已经这样做了(即使它没有100%安全)

EDIT2:我想我不能那样做,当我看到tutoriel时,我在他们的symfony工具栏上看到,我们可以看到用户的角色而不是匿名用户,但是他们没有这样做这是动态的。也许我不能动态地这样做,所以我需要在每次更改页面时发送用户信息

EDIT3:我将澄清我的问题:如何在登录时更改令牌类?

1 个答案:

答案 0 :(得分:1)

您不需要创建令牌,但需要this answer

中描述的编码器

之后,您可以使用此代码以编程方式登录

$token = new UsernamePasswordToken($player, $player->getPassword(), "main");

$event = new InteractiveLoginEvent(new Request(), $token);

$this->container->get("event_dispatcher")->dispatch("security.interactive_login", $event);

$this->container->get("security.token_storage")->setToken($token);

现在您可以使用标准的symfony安全功能来检查用户是否登录等