#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. Концепция точно такая же.