2013-04-22 2 views
5

Ich habe 2 Bündel in meinem Projekt:Symfony2 Sicherheit: Mehrere Anbieter

  • src/Korea/AlmacenBundle
  • src/Galvez/RepuestosBundle

Jede mit ihrer eigenen Datenbank

  • korea_motos -> AlmacenBundle
  • galvez_motos -> Re puestosBundle

Eigentlich mein security.yml hat nur einen Anbieter:

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

Wie Sie sehen können, beide Bündel von derselben Tabelle authentifiziert werden: Usuario, in korea_motos

TABLE: Usuario (korea_motos Datenbank)

--ID-- | ---- ---- NUTZERNAME | --------- BUNDLE ---

----- 1 ---- - | --- ---------- Admin ---------------- | ---------- AlmacenBundle ----------

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

Jetzt möchte ich die Benutzer validieren, für RepuestosBundle mit einer Tabelle Usuario in galvez_motos, Entfernen der Spalte "Bündel" in der vorherigen Tabelle.

Das Problem liegt in der Security.yml-Datei. Wenn ich dies machen:

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

Symfony starten eine Ausnahme:

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

Im Versuch 2 Anbieter zu verwenden, eine Tabelle pro jedes Bündel .. ist das möglich?

Dateien: security.yml

jms_security_extra: 
secure_all_services: false 
expressions: true 

Sicherheit: Geber: Korea \ AlmacenBundle \ Entity \ Benutzer: Algorithmus: SHA1 encode_as_base64: false Iterationen: 1 Galvez \ RepuestosBundle \ Entity \ Usuario: Algorithmus: sHA1 encode_as_base64: false Iterationen: 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 - nicht kopieren/einfügen alle :(

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: ~ 

Parameter.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 für mein Englisch: S

Antwort

0

Dies ist wahrscheinlich ein Problem mit Namensräumen der Klassen. Überprüfen Sie, ob die Klasse Galvez\RepuestosBundle\Entity\Usuario im richtigen Namespace ist und ob die Konfiguration korrekt ist - vielleicht haben Sie versehentlich einen Code zum Kopieren und Einfügen von der anderen Entität hinterlassen.

Versuchen Sie, beide Entitäten beizubehalten und sie (ohne Sicherheitskontext) zu holen - ich denke, dass Sie Ihr Problem dort finden werden.

0

machte ich einen Test mit beiden Entitäten:

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

feine Arbeiten, aber wenn ich benutze

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

statt

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

Wenn Ich versuche zu spülen, Sym fony launchs den gleichen Fehler:

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: Nun, ich denke, es ist nicht möglich, wenn ich ändere das:

default_connection: korea

auf:

default_connection: galvez

Symfony sagt:

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

den gleichen Fehler, aber in umgekehrter ..

Es ist wie der Monolog Validierung scheint nehmen Sie die Standardverbindung (Korea in diesem Fall) für suchen und validieren

10

Alte Frage aber für jeden, der nach einer Lösung sucht, erklärt das Handbuch alles here. Grundsätzlich müssen Sie Ihre Anbieter wie folgt verketten:

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