Symfony2 FosUserBundle自定义登录查询 [英] Symfony2 FosUserBundle customize Login query

查看:56
本文介绍了Symfony2 FosUserBundle自定义登录查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Symfony2项目中使用FosUserBundle,我的登录名有效,我现在想进一步自定义登录名,以包括ID,用户名,电子邮件和密码的检查.我在Entity文件夹中有一个User实体,我在Repository文件夹中有一个UserRepository

i'm using FosUserBundle in my Symfony2 project, i have the login working, i want to now further customize login to include checking for id along with username, email and password. i have a User entity in the Entity folder, i have a UserRepository in the Repository folder

  • 如何自定义Fos UserBundle登录名以在其查询中包含ID
  • 我可以这样做的几种不同方式列表
  • 欢迎任何其他改进代码的建议

-谢谢

用户实体:

<?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 ;
}
}

Security.yml

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

推荐答案

在扩展FOS\UserBundle\Doctrine\UserManager的实体文件夹中创建一个类(我假设存在一个名为siteConfig.php的类,该类具有由db更新的静态University_id字段查询)

Create a class inside entity folder that extends FOS\UserBundle\Doctrine\UserManager (i'm assuming there is a class called siteConfig.php with a static University_id field updated by a db query)

<?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));
}
}

在service.yml内部对用户管理器进行依赖注入

Dependency injection for User manager, inside 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下添加以下配置

Inside config.yml add the following configuration under fos_user

service:
    user_manager: ExampleUserManager

在提供程序下的security.yml内部添加以下内容

Inside security.yml under provider add the following

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

这篇关于Symfony2 FosUserBundle自定义登录查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆