Здравствуйте, начал делать аутентификацию в проекте на 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
Заранее спасибо!
Для редиректра придётся вешать событие на все запросы:
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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть меню, подгружаю через jquery страницу php, содержащую форму, вот только js код игнорирует preventDefault и в итоге форма отправляется, и меня кидает...
Доброго времени сутокДабы не загружать Вас лишней информацией, вкратце и с примерами, опишу в чём проблема
Возникла надобность натянуть верстку на Wordpress, за основу взял чистый шаблон, но никак не могу понять как правильно прописать пути к изображениям...
Как удалить в autoNumeric в input дробную часть из лишних нулей Параметр mDec добавляет дробную часть, но при снятии фокуса с элемента, если дробная...