Безопасность Symfony2: несколько провайдеров

У меня есть 2 пакета в моем проекте:

  • ЦСИ / Корея /AlmacenBundle
  • SRC / Галвес /RepuestosBundle

Каждый со своей базой данных

  • korea_motos -> AlmacenBundle
  • galvez_motos -> RepuestosBundle

На самом деле у моего security.yml есть только один провайдер:

providers:
    korea:
        entity: { class: Korea\AlmacenBundle\Entity\Usuario, property: username }

Как видите, оба пакета проходят проверку подлинности в одной и той же таблице: Usuario, в korea_motos

ТАБЛИЦА: Usuario (база данных korea_motos)

--ID-- | ---- USERNAME ---- | --------- ПАКЕТ ---

----- 1 ----- | ------------- админ ---------------- | ------- --- AlmacenBundle ----------

----- 2 ----- | ------------- админ ----------------|----------RepuestosBundle-------

Теперь я хочу проверить пользователей для RepuestosBundle с помощью таблицы Usuario в galvez_motos, удалив столбец "bundle" в предыдущей таблице.

Проблема в файле security.yml. Если я сделаю это:

providers:
    korea:
        entity: { class: Korea\AlmacenBundle\Entity\Usuario, property: username }
    galvez:
        entity: { class: Galvez\RepuestosBundle\Entity\Usuario, property: username }

Symfony запускает исключение:

The class 'Galvez\RepuestosBundle\Entity\Usuario' was not found in the chain configured namespaces Korea\AlmacenBundle\Entity

Я пытаюсь использовать 2 провайдеров, по одной таблице на каждый пакет.. это возможно?

Файлы: security.yml

jms_security_extra:
secure_all_services: false
expressions: true

security: кодировщики: Корея \AlmacenBundle\Entity\Usuario: алгоритм: sha1 encode_as_base64: ложные итерации: 1 Galvez\RepuestosBundle\Entity\Usuario: алгоритм: sha1 encode_as_base64: ложные итерации: 1

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: [ ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH ]

providers:
    korea:
        entity: { class: Korea\AlmacenBundle\Entity\Usuario, property: username }
    galvez:
        entity: { class: Galvez\RepuestosBundle\Entity\Usuario, property: username }

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false

    login:
        pattern:  ^/demo/secured/login$
        security: false

    secured_area:
        pattern:    ^/
        anonymous: ~
        access_denied_handler: accessdenied_handler
        form_login:
            login_path:  /login
            check_path:  /login_check
            default_target_path: /redirect
            always_use_default_target_path: true
        logout:
            path:   /logout
            target: /login
        #anonymous: ~
        #http_basic:
        #    realm: "Secured Demo Area"

access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/redirect, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/galvez, roles: ROLE_ADMIN_GALVEZ }
    - { path: ^/, roles: ROLE_ADMIN_KOREA }

config.yml - не могу скопировать / вставить все:(

doctrine:
dbal:
    default_connection:   default
    connections:
        default:
            driver:   "%database_driver%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            host:     "%database_host%"
            port:     "%database_port%"
            charset:  UTF8
        galvez:
            driver:   %database_driver%
            dbname:   %database_name2%
            user:     %database_user2%
            password: %database_password2%
            host:     %database_host%
            port:     %database_port%
            charset:  UTF8
orm:
    default_entity_manager:   default
    entity_managers:
        default:
            connection:       default
            mappings:
                AlmacenBundle: ~
        galvez:
            connection:       galvez
            mappings:
                RepuestosBundle: ~

parameters.yml

parameters:
database_driver: pdo_mysql
database_host: localhost
database_port: null
database_name: korea_motos
database_user: root
database_password:
mailer_transport: smtp
mailer_host: localhost
mailer_user: null
mailer_password: null
locale: en
secret: 5f7ac4e7c2b38d6dbe55a1f05bee2b02
database_path: null

database_name2: galvez_motos
database_user2: root
database_password2:

PD: Sry для моего английского: S

3 ответа

Старый вопрос, но для тех, кто ищет решение, руководство объясняет все это здесь. По сути, вам нужно связать своих провайдеров следующим образом:

# app/config/security.yml
security:
    providers:
        chain_provider:
            chain:
                providers: [korea, galvez]
        korea:
            entity: { class: Korea\AlmacenBundle\Entity\Usuario, property: username }
        galvez:
            entity: { class: Galvez\RepuestosBundle\Entity\Usuario, property: username }

Это, вероятно, проблема с пространствами имен ваших классов. Проверьте, если класс Galvez\RepuestosBundle\Entity\Usuario находится в правильном пространстве имен, и если конфигурация правильная - возможно, вы случайно оставили некоторый код копирования и вставки из другого объекта.

Попробуйте сохранить обе эти сущности и получить их (без контекста безопасности) - я думаю, что вы найдете там свою проблему.

Я сделал тест с обоими объектами:

abcController.php

$em= $this->get('doctrine')->getManager('galvez');

$usuario_g = $this->get('doctrine')->getRepository('RepuestosBundle:Usuario', 'galvez')->find(1);
$usuario_g->setUsername('asdasd');
$em->persist($usuario_g);
$em->flush();

Работает нормально, но если я использую

$em = $this->getDoctrine()->getEntityManager();

вместо

$em = $this->get('doctrine')->getManager('galvez');

Когда я пытаюсь сбросить, Symfony запускает ту же ошибку:

The class 'Galvez\RepuestosBundle\Entity\Usuario' was not found in the chain configured namespaces Korea\AlmacenBundle\Entity

Usuario.php (AlmacenBundle)

<?php

namespace Korea\AlmacenBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

/**
 * Usuario
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Korea\AlmacenBundle\Entity\UsuarioRepository")
 */
class Usuario implements UserInterface
{

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

/**
 * @var string
 *
 * @ORM\Column(name="username", type="string", length=255)
 */
private $username;

/**
 * @var string
 *
 * @ORM\Column(name="password", type="string", length=255)
 */
private $password;

/**
 * @var string
 *
 * @ORM\Column(name="salt", type="string", length=255)
 */
private $salt;

Usuario.php (RepuestosBundle)

<?php

namespace Galvez\RepuestosBundle\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

/**
* Usuario
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Galvez\RepuestosBundle\Entity\UsuarioRepository")
*/
class Usuario implements UserInterface
{

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

/**
 * @var string
 *
 * @ORM\Column(name="username", type="string", length=255)
 */
private $username;

/**
 * @var string
 *
 * @ORM\Column(name="password", type="string", length=255)
 */
private $password;

/**
 * @var string
 *
 * @ORM\Column(name="salt", type="string", length=255)
 */
private $salt;

PD: Ну, я думаю, что это невозможно, если я изменю это:

default_connection: Корея

чтобы:

default_connection: galvez

Symfony говорит:

MappingException: The class 'Korea\AlmacenBundle\Entity\Usuario' was not found in the chain configured namespaces Galvez\RepuestosBundle\Entity

та же ошибка, но в обратном порядке..

Похоже, что при проверке монолога для поиска и проверки используется соединение по умолчанию (в данном случае Корея)

Другие вопросы по тегам