2013-04-22 9 views
5

複数のプロバイダ:Symfony2のセキュリティ:私は私のプロジェクトで2つのバンドルを持って

  • のsrc /韓国/ AlmacenBundle
  • のsrc /ガルベス/ RepuestosBundle

、独自のデータベースを持つ各

  • korea_motos - > AlmacenBundle
  • galvez_motos - > Re

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

    あなたが見ることができるように、両方のバンドルが同じテーブルによって認証されています:korea_motos

    TABLEでUsuario、:Usuario(puestosBundle

は、実は私のsecurity.ymlは、1つのプロバイダのみを持っていますkorea_motosデータベース)

--ID-- | ---- ---- USERNAME | --------- BUNDLE ---

----- 1 ---- - | --- ---------- admin ---------------- | ---------- AlmacenBundle ----------

----- 2 ---- | ------------- admin ---------------- | ---- ------- RepuestosBundle -------

ここで、前の表の列 "bundle"を削除して、galuz_motosのテーブルUsuarioを使用して、RepuestosBundleのユーザーを検証したいと考えています。

問題は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 \エンティティ\ Usuario: アルゴリズム:SHA1 encode_as_base64:偽 の反復:1 ガルベス\ RepuestosBundle \エンティティ\ 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:まあ、私はあれば、それは可能ではないと思います私はこれを変える:

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 } 
関連する問題