Как использовать две коллекции для аутентификации zfcuser?

#mongodb #authentication #doctrine-orm #zend-framework2 #zfcuser

#mongodb #аутентификация #doctrine-orm #zend-framework2 #zfcuser

Вопрос:

Я использую модули Doctrine и MongoDB ODM в своем приложении zf2. ZfcUser используется для авторизации.

Есть ли способ использовать две коллекции, скажем users , и clients для аутентификации через zfcuser doctrine? Мне любопытно, есть ли способ объединить две коллекции mongo в одну, чтобы использовать их в сочетании для аутентификации?

Комментарии:

1. У меня нет опыта работы со средой, с которой вы работаете, но в чистом mongodb вы бы просто сделали два запроса.

Ответ №1:

Вам не нужно объединять пользователей в одну коллекцию, поскольку у вас может быть несколько «адаптеров аутентификации» (см. ZfcUserAuthenticationAdapterDb Пример)

Они определены в глобальном файле конфигурации: zfcuser.global.php

Каждый из моих адаптеров запускается в порядке приоритета, пока не будет возвращен результат успешной аутентификации.

Например; У меня есть следующая конфигурация для Users Candidates объектов и.

 /**     
 * Authentication Adapters
 *
 * Specify the adapters that will be used to try and authenticate the user
 *
 * Default value: array containing 'ZfcUserAuthenticationAdapterDb' with priority 100
 * Accepted values: array containing services that implement 'ZfcUserAuthenticationAdapterChainableAdapter'
 */
'auth_adapters' => array( 
    50  => 'JobboardCandidateAuthenticationAdapterCandidateDatabaseAdapter',
    75  => 'JobboardUserAuthenticationAdapterUserDatabaseAdapter',
    //100 => 'ZfcUserAuthenticationAdapterDb', [this is the default]
),
  

Ответ №2:

Как я понимаю из вашего вопроса, вы хотите получить одну коллекцию с двумя разными типами документов, чтобы вы могли использовать эту коллекцию для аутентификации. Если вы используете сопоставление наследования doctrine, вы можете иметь два разных класса и разрешать их в одной коллекции. В этом случае ваш Client класс расширит ваш User класс. Если бы вы использовали findAll метод в своем UserRepository , вы бы получили как клиентов, так и пользователей в одном Collection

Это поможет вам достичь того, чего вы хотите:

 <?php
namespace MyProjectModel;

/**
 * @Document
 * @InheritanceType("SINGLE_COLLECTION")
 * @DiscriminatorField(name="discriminator", type="string")
 * @DiscriminatorMap({"user" = "User", "client" = "Client"})
 */
class User
{
    // ...
}

/**
 * @Document
 */
class Client extends User
{
    // ...
}
  

И затем

 $userRepository->findAll();
  

Подробнее о сопоставлении наследования читайте здесь, в документации Doctrine

Комментарии:

1. Почему вы упоминаете Entity, ORM и так далее? Я использую MongoDB Doctrine ODM. Но ODM также имеет отображение наследования — doctrine-mongodb-odm.readthedocs.org/en/latest/reference /…

2. Извините за мою ошибку, я думал, вы используете Doctrine ORM2. Но я думаю, вы действительно могли бы сделать то же самое с отображением наследования Doctrine ODM. Концепция точно такая же.