2013-04-22 2 views
5

У меня есть 2 связки в моем проекте:Symfony2 безопасности: Несколько провайдеров

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

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

  • korea_motos -> AlmacenBundle
  • galvez_motos -> Re puestosBundle

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

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

Как вы можете видеть, как пучки удостоверены теми же таблицы: Новичок в korea_motos

ТАБЛИЦЫ: Новичок (база данных korea_motos)

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

----- 1 ---- - | --- ---------- admin ---------------- | ---------- 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 

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

Файлы: security.yml

jms_security_extra: 
secure_all_services: false 
expressions: true 

безопасности: кодеры: Корея \ AlmacenBundle \ Entity \: Новичок алгоритм: sha1 encode_as_base64: ложные итераций: 1 Галвес \ RepuestosBundle \ Entity \ Usuario: алгоритм: sha1 encode_as_base64: false итерации: 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: ~ 

параметров.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

ответ

0

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

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

0

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

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');

Когда я пытаюсь очистить, Sym Fony launchs ту же ошибку:

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: Ну, я думаю, что это не возможно, если i изменить это:

default_connection: korea

в:

default_connection: galvez

Symfony говорит:

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

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

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

10

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

# 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 }