如何使用多个用户提供程序
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 3.4,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
如何使用多个用户提供程序
请注意
对于每种身份验证机制,最好使用特定的用户提供程序。在大多数应用程序中应避免链接用户提供者,仅用于解决边缘情况。
每种身份验证机制(例如HTTP身份验证、表单登录等)都只使用一个用户提供程序,并且默认使用第一个声明的用户提供程序。但是,如果您希望通过配置指定一些用户,而在数据库中指定其余用户,该怎么办呢?这可以通过创建一个新的提供者将两者链接在一起来实现:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12
# app / config / security.yml安全:提供者:用户:链:提供者:[users_in_memory,users_in_db]users_in_memory:记忆:用户:foo:{密码:测验}users_in_db:实体:{类:实体AppBundle \ \用户,属性:用户名}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
<!——app/config/security.xml——> .xml<?xml version="1.0" encoding="UTF-8"?><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><配置><提供者的名字=“用户”><链><提供者>users_in_memory提供者><提供者>users_in_db提供者>链>提供者><提供者的名字=“users_in_memory”><内存><用户的名字=“foo”密码=“测试”/>内存>提供者><提供者的名字=“users_in_db”><实体类=“实体AppBundle \ \用户”财产=“用户名”/>提供者>配置>srv:容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ / app / config / security.php使用AppBundle\实体\用户;$容器->loadFromExtension (“安全”, (“供应商”= > [“用户”= > [“链”= > [“供应商”= > [“in_memory”,“user_db”],],],“users_in_memory”= > [“记忆”= > [“用户”= > [“foo”= > [“密码”= >“测试”],],],],,“users_in_db”= > [“实体”= > [“类”= >用户::类,“属性”= >“用户名”,],],],]);
现在,所有显式定义的防火墙用户
因为它们的用户提供程序将依次尝试从两个users_in_memory
然后users_in_db
提供者。
3.4
在以前的Symfony版欧宝娱乐app下载地址本中,没有显式定义其用户提供程序的防火墙使用第一个现有提供程序(用户
在这个例子中)。但是,自动选择第一个用户提供程序在Symfony 3.4中已弃用,在4.0中会抛出异常。欧宝娱乐app下载地址当有多个提供程序时,始终定义防火墙使用的提供程序。
您还可以配置防火墙或单独的身份验证机制来使用特定的提供程序。同样,除非显式指定了提供者,否则总是使用第一个提供者:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
# app / config / security.yml安全:防火墙:secured_area:#……模式:^ /供应商:users_in_dbhttp_basic:域:“安全演示区”供应商:users_in_memoryform_login:~
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!——app/config/security.xml——> .xml<?xml version="1.0" encoding="UTF-8"?><srv:容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/security”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:深水救生艇=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><配置><防火墙的名字=“secured_area”模式=“^ /”提供者=“users_in_db”><!——……--><http基本领域=“安全演示区”提供者=“users_in_memory”/><登录/>防火墙>配置>srv:容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / app / config / security.php$容器->loadFromExtension (“安全”, (“防火墙”= > [“secured_area”= > [/ /……“模式”= >' ^ /,“供应商”= >“users_in_db”,“http_basic”= > [“领域”= >“安全演示区”,“供应商”= >“users_in_memory”),“form_login”=> [],],],]);
在本例中,如果用户试图通过HTTP认证登录,认证系统将使用users_in_memory
用户提供者。但是,如果用户试图通过表单登录登录,则users_in_db
Provider将被使用(因为它是整个防火墙的默认值)。
如果你需要检查你的提供者返回的用户是否允许进行身份验证,检查返回的用户对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用欧宝娱乐app下载地址\组件\安全\核心\用户;/ /……公共函数loadUserByUsername($用户名){/ /……//你可以,例如,测试返回的用户是一个对象//指定类或检查用户对象的某些属性如果($用户实例用户){//从主安全配置文件加载用户。做点什么。/ /……}返回$用户;}
有关用户提供程序和防火墙配置的详细信息,请参见安全配置参考(SecurityBundle).
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。