Безопасность 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
та же ошибка, но в обратном порядке..
Похоже, что при проверке монолога для поиска и проверки используется соединение по умолчанию (в данном случае Корея)