2013-04-22 17 views
5

mam 2 pakiety w moim projekcie:Symfony2 bezpieczeństwo: Wiele dostawców

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

Każda z własnej bazy

  • korea_motos -> AlmacenBundle
  • galvez_motos -> Re puestosBundle

Właściwie moja security.yml ma tylko jednego dostawcę:

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

Jak widać, oba pakiety są uwierzytelniane przez tę samą tabelą: usuario w korea_motos

TABELA: Usuario (baza korea_motos)

--ID-- | ---- NAZWA_UŻYTKOWNIKA ---- | --------- BUNDLE ---

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

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

Teraz chcę sprawdzić użytkowników, dla RepuestosBundle z tabelą Usuario w galvez_motos, usuwając kolumnę "bundle" z poprzedniej tabeli.

Problem dotyczy pliku security.yml. Jeśli zrobię to:

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

Symfony uruchomić wyjątek:

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

Im próbuje użyć 2 dostawców, jeden stolik na każdej wiązce .. jest to możliwe?

Pliki: security.yml

jms_security_extra: 
secure_all_services: false 
expressions: true 

zabezpieczeń: kodery: Korea \ AlmacenBundle \ Entity \ Użytkownik: algorytmu: SHA1 encode_as_base64: fałszywe iteracji: 1 Galvez \ RepuestosBundle \ Entity \ Algorytm: sha1 algorytm: sha1 encode_as_base64: false iteracje: 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 - nie można skopiować/przenieść wszystkie :(

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

parametry.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 za mój angielski: S

Odpowiedz

0

Jest to prawdopodobnie problem z nazw swoich klasach. Sprawdź, czy klasa Galvez\RepuestosBundle\Entity\Usuario znajduje się we właściwym obszarze nazw i czy konfiguracja jest poprawna - może przypadkowo zostawiłeś jakiś kod kopiuj-wklej z drugiej encji.

Spróbuj przetrwać obie te jednostki i pobrać je (bez kontekstu zabezpieczeń) - Myślę, że znajdziesz tam swój problem.

0

Zrobiłem test z obu jednostek:

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

działa dobrze, ale jeśli mogę użyć

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

zamiast

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

Kiedy Próbuję spłukać, Sym Fony launchs ten sam błąd:

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: Cóż, myślę, że to nie jest możliwe, jeśli zmieniam to:

default_connection: korea

do:

default_connection: galvez

Symfony mówi:

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

tego samego błędu, ale w odwrotnej kolejności ..

Wygląda walidacji monolog wziąć połączenia domyślnego (Korea w tym przypadku) do Wyszukaj i zweryfikuj

10

Stare pytanie, ale dla każdego, kto szuka rozwiązania, instrukcja wyjaśnia wszystko here. Zasadniczo należy połączyć dostawców takich jak:

# 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 } 
Powiązane problemy