Symfony2 安全性:多个提供者
Posted
技术标签:
【中文标题】Symfony2 安全性:多个提供者【英文标题】:Symfony2 security: Multiple providers 【发布时间】:2013-04-15 19:05:30 【问题描述】:我的项目中有 2 个捆绑包:
src/Korea/AlmacenBundle src/Galvez/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--|----用户名----|---------捆绑包---
-----1-----|-------------管理员----|---- ------AlmacenBundle----------
-----2-----|-------------管理员----|---- ------RepuestosBundle------
现在我想验证用户,对于 RepuestosBundle,在 galvez_motos 中有一个表 Usuario,删除上一个表中的“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 个提供程序,每个包一个表。这可能吗?
文件: 安全性.yml
jms_security_extra:
secure_all_services: false
expressions: true
安全性: 编码器: 韩国\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:对不起我的英语:S
【问题讨论】:
【参考方案1】:老问题,但对于任何寻求解决方案的人,手册都解释了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
【讨论】:
【参考方案2】:这可能是您的类的命名空间的问题。检查类 Galvez\RepuestosBundle\Entity\Usuario
是否在正确的命名空间中以及配置是否正确 - 也许您不小心留下了来自其他实体的一些复制粘贴代码。
尝试保留这两个实体并获取它们(没有安全上下文) - 我想你会在那里找到你的问题。
【讨论】:
【参考方案3】:我对这两个实体进行了测试:
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:韩国
到:
默认连接:galvez
Symfony 说:
MappingException: The class 'Korea\AlmacenBundle\Entity\Usuario' was not found in the chain configured namespaces Galvez\RepuestosBundle\Entity
同样的错误,但相反..
似乎独白验证采用默认连接(在本例中为韩国)进行搜索和验证
【讨论】:
以上是关于Symfony2 安全性:多个提供者的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2 不会加载自定义身份验证提供程序,加载 DaoAuthenticationProvider
Symfony 2 安全总是返回 Bad Credentials 错误