Symfony 3 авторизация

913
18 января 2017, 02:29

Здравствуйте, начал делать аутентификацию в проекте на Symfony 3(пишу на нем впервые) и столкнулся с такой проблемой.
Писал код на основе документации, а если конкретно - с помощью данной главы(https://symfony.com/doc/current/security/entity_provider.html). В связи с этим у меня 2 вопроса:
1. - как редиректить гостя для авторизации по маршруту /login?
2. - как использовать свою форму вместо стандартной браузерной?
Мой entity class User:

<?php
namespace AppBundle\Entity;
use AppBundle\Utils\FileHelper;
use AppBundle\Utils\StringHelper;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 */
class User implements AdvancedUserInterface, \Serializable
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=25, unique=true)
     * @Assert\NotBlank()
     * @Assert\Length(
     *      min = 2,
     *      max = 25,
     *      minMessage = "Имя должно состоять как минимум из {{ limit }} символов",
     *      maxMessage = "Имя должно состоять максимум из {{ limit }} символов"
     * )
     */
    private $username;
    /**
     * @ORM\Column(type="string", length=64)
     * @Assert\NotBlank()
     * @Assert\Length(
     *      min = 5,
     *      max = 64,
     *      minMessage = "Пароль должен состоять как минимум из {{ limit }} символов",
     *      maxMessage = "Пароль должен состоять максимум из {{ limit }} символов"
     * )
     */
    private $password;
    /**
     * @ORM\Column(type="string", length=60, unique=true)
     * @Assert\NotBlank()
     * @Assert\Length(
     *      min = 3,
     *      max = 60,
     *      minMessage = "Почта должна состоять как минимум из {{ limit }} символов",
     *      maxMessage = "Почта должна состоять максимум из {{ limit }} символов"
     * )
     */
    private $email;
    /**
     * @ORM\Column(type="string", length=15)
     */
    private $alias;
    /**
     * @ORM\Column(type="string", length=50, nullable=true)
     */
    private $avatar = null;
    /**
     * @Assert\File(
     *     mimeTypes = {
     *          "image/png",
     *          "image/jpeg",
     *          "image/jpg",
     *      }
     * )
     */
    private $file;
    /**
     * @ORM\Column(name="is_active", type="boolean")
     */
    private $isActive;
    public function __construct()
    {
        $this->isActive = true;
        $this->alias = StringHelper::createRandomString();
    }
    protected function getUploadRootDir()
    {
        return __DIR__.'/../../../web/' . $this->getUploadDir();
    }
    protected function getUploadDir()
    {
        return 'uploads/users';
    }
    public function getUsername()
    {
        return $this->username;
    }
    public function getSalt()
    {
        return null;
    }
    public function getPassword()
    {
        return $this->password;
    }
    public function getRoles()
    {
        return array('ROLE_USER');
    }
    public function eraseCredentials()
    {
    }
    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
            $this->isActive
            // $this->salt,
        ));
    }
    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
            $this->isActive
            // $this->salt
            ) = unserialize($serialized);
    }
    public function isAccountNonExpired()
    {
        return true;
    }
    public function isAccountNonLocked()
    {
        return true;
    }
    public function isCredentialsNonExpired()
    {
        return true;
    }
    public function isEnabled()
    {
        return $this->isActive;
    }
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set username
     *
     * @param string $username
     *
     * @return User
     */
    public function setUsername($username)
    {
        $this->username = $username;
        return $this;
    }
    /**
     * Set password
     *
     * @param string $password
     *
     * @return User
     */
    public function setPassword($password)
    {
        $this->password = $password;
        return $this;
    }
    /**
     * Set email
     *
     * @param string $email
     *
     * @return User
     */
    public function setEmail($email)
    {
        $this->email = $email;
        return $this;
    }
    /**
     * Get email
     *
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }
    /**
     * Set alias
     *
     * @param string $alias
     *
     * @return User
     */
    public function setAlias($alias)
    {
        $this->alias = $alias;
        return $this;
    }
    /**
     * Get alias
     *
     * @return string
     */
    public function getAlias()
    {
        return $this->alias;
    }
    /**
     * Set avatar
     *
     * @param string $avatar
     *
     * @return User
     */
    public function setAvatar($avatar)
    {
        $this->avatar = $avatar;
        return $this;
    }
    /**
     * Get avatar
     *
     * @return string
     */
    public function getAvatar()
    {
        return $this->avatar;
    }
    /**
     * Set isActive
     *
     * @param boolean $isActive
     *
     * @return User
     */
    public function setIsActive($isActive)
    {
        $this->isActive = $isActive;
        return $this;
    }
    /**
     * Get isActive
     *
     * @return boolean
     */
    public function getIsActive()
    {
        return $this->isActive;
    }
    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {
        $this->file = $file;
    }
    /**
     * Get file.
     *
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    } 
}

Мой repository class UserRepository:

<?php
namespace AppBundle\Repository;
use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
use Doctrine\ORM\EntityRepository;
class UserRepository extends EntityRepository implements UserLoaderInterface
{
    public function loadUserByUsername($username)
    {
        return $this->createQueryBuilder('u')
            ->where('u.username = :username OR u.email = :email')
            ->setParameter('username', $username)
            ->setParameter('email', $username)
            ->getQuery()
            ->getOneOrNullResult();
    }
} 

Мой конфиг security.yml: security:

encoders:
        AppBundle\Entity\User:
            algorithm: bcrypt
# http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
    our_db_provider:
        entity:
            class: AppBundle:User
firewalls:
    # disables authentication for assets and the profiler, adapt it according to your needs
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        pattern:    ^/
        http_basic: ~
        provider: our_db_provider  

Заранее спасибо!

Answer 1

Для редиректра придётся вешать событие на все запросы:

services:
    app.tokens.action_listener:
        class: AppBundle\EventListener\RedirectUserListener
        arguments:
            - "@security.token_storage"
            - "@router"
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
namespace AppBundle\EventListener;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
class RedirectUserListener
{
    private $tokenStorage;
    private $router;
    public function __construct(TokenStorageInterface $t, RouterInterface $r)
    {
        $this->tokenStorage = $t;
        $this->router = $r;
    }
    public function onKernelRequest(GetResponseEvent $event)
    {
        // check user here by $this->tokenStorage
        $response = new RedirectResponse($this->router->generate('action_name'));
        $event->setResponse($response);
    }
}

Подробно создание собственной формы описано в howto

READ ALSO
preventDefault событие

preventDefault событие

Есть меню, подгружаю через jquery страницу php, содержащую форму, вот только js код игнорирует preventDefault и в итоге форма отправляется, и меня кидает...

424
Привести данные из таблицы в такую структуру ассоциативного массива

Привести данные из таблицы в такую структуру ассоциативного массива

Доброго времени сутокДабы не загружать Вас лишней информацией, вкратце и с примерами, опишу в чём проблема

332
Пути к изображениям wordpress

Пути к изображениям wordpress

Возникла надобность натянуть верстку на Wordpress, за основу взял чистый шаблон, но никак не могу понять как правильно прописать пути к изображениям...

399
Autonumeric удалить лишние нули

Autonumeric удалить лишние нули

Как удалить в autoNumeric в input дробную часть из лишних нулей Параметр mDec добавляет дробную часть, но при снятии фокуса с элемента, если дробная...

500