Symfony2 FosUserBundle настроить запрос входа

Я использую FosUserBundle в моем проекте Symfony2, у меня есть вход в систему, я хочу теперь дополнительно настроить вход в систему, чтобы включить проверку идентификатора вместе с именем пользователя, адресом электронной почты и паролем. у меня есть сущность пользователя в Entity папка, у меня есть UserRepository в Repository папка

  • Как настроить логин Fos UserBundle для включения идентификатора в свой запрос
  • Каков список возможных различных способов, которыми я мог бы сделать это?
  • любые другие предложения по улучшению кода приветствуются

-благодарю вас

Пользовательский объект:

<?php
namespace Example\Bundle\ExampleBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
* User
*
* @ORM\Table(name="Example_user")
* @ORM\Entity(repositoryClass="Example\Bundle\ExampleBundle\Repository\UserRepository")
*/
class User extends BaseUser {

/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/*
*  some Class properties here
*
*/

/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}

/*
* some setters and getters here
*/
}

Репозиторий пользователей

<?php
namespace Example\Bundle\ExampleBundle\Repository;

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Security\Core\User\UserProviderInterface;

use Example\Bundle\ExampleBundle\siteConfig;

class UserRepository extends EntityRepository implements UserProviderInterface{

public $university = siteConfig::university_id;

/**
*
* @param type $username
*/
public function FindUsernameOrEmailInUniversity($username, $universityId) {

return  $this->createQueryBuilder('user')
->where('user.university_id = :universityId')
->andWhere('user.username = :username OR user.email = :email')
->setParameter('universityId', $universityId)
->setParameter('username', $username)
->setParameter('email', $username)
->getQuery()
->getOneOrNullResult();

}

/**
*
* @param type $username
*/
public function loadUserByUsername($username) {

$user = $this->FindUsernameOrEmailInUniversity($username, $this->university); //check order of parameters use type hinting

if(!$user){
throw new \Symfony\Component\Security\Core\Exception\UsernameNotFoundException('User Name '.$username.' Not Found');
}

return $user;
}

/**
*
* @param \Symfony\Component\Security\Core\User\UserInterface $user
*/
public function refreshUser(\Symfony\Component\Security\Core\User\UserInterface $user) {

return $user;
}

/**
*
* @param type $class
*/
public function supportsClass($class) {

return ;
}
}

The Security.yml

# app/config/security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt

role_hierarchy:
ROLE_ADMIN:       ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN

providers:
fos_userbundle:
entity: { class: Example\Bundle\ExampleBundle\Repository\UserRepository }

firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
logout:       true
anonymous:    true

access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }

Вот ошибка, которую я получаю

The class 'Example\Bundle\ExampleBundle\Repository\UserRepository' was not found in the chain configured namespaces Example\Bundle\ExampleBundle\Entity, FOS\UserBundle\Entity

1

Решение

Создайте класс внутри папки сущностей, которая расширяет FOS\UserBundle\Doctrine\UserManager (Я предполагаю, что существует класс с именем siteConfig.php со статическим полем University_id, обновляемым запросом db)

<?php
namespace Example\Bundle\ExampleBundle\Entity

use FOS\UserBundle\Doctrine\UserManager as BaseUserManager;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use FOS\UserBundle\Util\CanonicalizerInterface;
use FOS\UserBundle\Model\UserInterface;
use Example\Bundle\ExampleBundle\siteConfig;

class UserManager extends BaseUserManager {
public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer,
CanonicalizerInterface $emailCanonicalizer, EntityManager $em, $class) {

parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer, $em, $class);

}
/**
* this overides the findUserByUsernameOrEmail in FOS\UserBundle\Doctrine\UserManager
**/
public function findUserByUsernameOrEmail($usernameOrEmail) {
if (filter_var($usernameOrEmail, FILTER_VALIDATE_EMAIL)) {
return $this->findUserBy(array('emailCanonical' => $this->canonicalizeEmail($usernameOrEmail), 'university' => siteConfig::$university_id));
}

return $this->findUserBy(array('usernameCanonical' => $this->canonicalizeUsername($usernameOrEmail), 'university' => siteConfig::$university_id));
}
}

Внедрение зависимостей для диспетчера пользователей внутри services.yml

ExampleUserManager:
class: namespace Example\Bundle\ExampleBundle\Entity\UserManager
arguments: [@security.encoder_factory, @fos_user.util.username_canonicalizer, @fos_user.util.email_canonicalizer, @fos_user.entity_manager, namespace Example\Bundle\ExampleBundle\Entity\User]

Внутри config.yml добавьте следующую конфигурацию под fos_user

service:
user_manager: ExampleUserManager

Внутри security.yml под провайдером добавьте следующее

providers:
fos_userbundle:
id: fos_user.user_provider.username_email
1

Другие решения

Прежде всего, существует неправильный тип — дополнительный параграф при определении класса репозитория для строки сущности:

/**
* User
*
* @ORM\Table(name="Example_user")
* @ORM\Entity(repositoryClass="Example\Bundle\ExampleBundle\Repository\UserRepository")
*/
class User extends BaseUser {

Попробуйте это, я внес некоторые исправления в ваш метод:

/**
* @param type $username
*/
public function FindUsernameOrEmailInUniversity($username, University $university) {

return  $this->createQueryBuilder('user') //It should be alias for your entity name, and it could be anything you write, like 'user' or just 'u'
->where('user.university = :university')
->andWhere('user.username = :username OR user.email = :email')
->setParameter('university', $university)
->setParameter('username', $username)
->setParameter('email', $username)
->getQuery()
->getOneOrNullResult();

}

Также у вас есть геттеры, сеттеры и свойства для университета, электронной почты и имени пользователя? Я предполагаю, что вы хотите сделать университет как отношение к Пользователю, поэтому вы захотите правильно установить доктринальные отношения.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector