用户服务提供商
编辑本页用户服务提供商
用户提供者根据“用户标识符”(例如用户的电子邮件地址或用户名)从存储(例如数据库)(重新)加载用户。看到安全有关使用用户提供程序时的更详细信息。
ob娱乐下载Symfony提供了几个用户提供者:
实体用户提供商
这是最常见的用户提供程序。用户存储在数据库中,由用户提供程序使用学说去找回他们。
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/包/ security.yaml安全:提供者:用户:实体:#代表用户的实体的类类:“应用程序实体\ \用户”#要查询的属性,例如电子邮件,用户名等属性:“电子邮件”#可选:如果你使用多个Doctrine实体# managers,这个选项定义了使用哪个# manager_name:“客户”#……
使用自定义查询加载用户
实体提供程序只能查询其中一个具体的属性指定的财产
配置的关键。如果你想在这方面有更多的控制-例如,你想通过电子邮件
或用户名
,你可以通过实现UserLoaderInterface在你的教义库(如。UserRepository
):
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/ / src /仓库/ UserRepository.php名称空间应用程序\存储库;使用应用程序\实体\用户;使用学说\包\DoctrineBundle\存储库\ServiceEntityRepository;使用ob娱乐下载\桥\学说\安全\用户\UserLoaderInterface;类UserRepository扩展ServiceEntityRepository实现了UserLoaderInterface{/ /……公共函数loadUserByIdentifier(字符串$usernameOrEmail):哦?用户{$entityManager=$这->getEntityManager ();返回$entityManager->createQuery (SELECT u FROM App\Entity\User u WHERE u.username =:query OR u.email =:query)->setParameter (“查询”,$usernameOrEmail)->getOneOrNullResult ();}}
要完成这一步,移除财产
中的用户提供程序中的键security.yaml
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:提供者:用户:实体:类:应用实体\ \用户#……
现在,每当Symfony使用ob娱乐下载用户提供程序时,loadUserByIdentifier ()
方法UserRepository
将被调用。
内存用户提供商
不建议在实际应用程序中使用此提供程序,因为它有局限性,而且管理用户非常困难。它可能在应用程序原型和不将用户存储在数据库中的有限应用程序中很有用。
这个用户提供程序将所有用户信息存储在一个配置文件中,包括他们的密码。确保密码被正确散列。看到密码哈希和验证获取更多信息。
设置散列后,可以在中配置所有用户信息security.yaml
:
1 2 3 4 5 6 7 8 9 10
#配置/包/ security.yaml安全:提供者:backend_users:记忆:用户:john_admin:{密码:2 y 13美元jxGxc美元……IuqDju”,角色:(“ROLE_ADMIN”)}jane_admin:{密码:2 y 13美元PFi1I美元……rGwXCZ”,角色:[' ROLE_ADMIN ',“ROLE_SUPER_ADMIN”]}#……
谨慎
当使用内存
提供者,而不是汽车
算法,你必须选择一个编码没有盐(即。bcrypt
).
连锁用户提供商
这个用户提供程序组合了两个或多个其他提供程序来创建一个新的用户提供程序。配置提供者的顺序很重要,因为Symfony将从第一个提供者开始查找用户,并将继续在其他提供者中查找,直到找到用户:ob娱乐下载
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#配置/包/ security.yaml安全:#……提供者:backend_users:ldap:#……legacy_users:实体:#……用户:实体:#……all_users:链:提供者:[' legacy_users ',“用户”,“backend_users”]
创建自定义用户提供程序
大多数应用程序不需要创建自定义提供程序。如果您将用户存储在数据库、LDAP服务器或配置文件中,Symfony支持这些功能。ob娱乐下载然而,如果你从一个自定义的位置加载用户(例如通过API或遗留的数据库连接),你需要创建一个自定义的用户提供程序。
首先,确保你遵循了安全指南要创建您的用户
类。
如果你使用:用户
命令创建您的用户
类(并且您回答了表明您需要自定义用户提供程序的问题),该命令将生成一个很好的框架来让您开始:
12 34 56 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
/ / src /安全/ UserProvider.php名称空间应用程序\安全;使用ob娱乐下载\组件\安全\核心\异常\UnsupportedUserException;使用ob娱乐下载\组件\安全\核心\异常\UserNotFoundException;使用ob娱乐下载\组件\安全\核心\用户\PasswordAuthenticatedUserInterface;使用ob娱乐下载\组件\安全\核心\用户\PasswordUpgraderInterface;使用ob娱乐下载\组件\安全\核心\用户\用户界面;使用ob娱乐下载\组件\安全\核心\用户\UserProviderInterface;类UserProvider实现了UserProviderInterface,PasswordUpgraderInterface{如果您使用sob娱乐下载witch_user *或remember_me等特性,Symfony将调用此方法。如果你不使用这些特性,你不需要实现这个方法。* *@throws如果用户未找到,则UserNotFoundException */公共函数loadUserByIdentifier(字符串$标识符):用户界面{//从数据源加载User对象或抛出UserNotFoundException异常。// $identifier参数是返回的值//你的User类中的getUserIdentifier()方法。扔新\异常('TODO:在内部填充loadUserByIdentifier() '.__FILE__);}/** *从会话中重新加载后刷新用户。当用户登录时,在每个请求的开始,从会话中加载* user对象,然后调用此方法。您的工作是确保用户的数据仍然是新鲜的,*例如,重新查询新的用户数据。* *如果你的防火墙是“无状态:true”(对于纯API),这个*方法不会被调用。* *@return用户界面* /公共函数refreshUser(用户界面$用户){如果(!$用户运算符用户){扔新UnsupportedUserException (sprintf (“无效用户类“%s”。”get_class ($用户)));}//确认User对象的数据为“新鲜”后返回一个User对象。//或者抛出UserNotFoundException,如果用户不再存在。扔新\异常('TODO: fill in refreshUser() inside '.__FILE__);}/** *告诉Symfoob娱乐下载ny为这个User类使用这个提供程序。* /公共函数supportsClass(字符串$类){返回用户::类= = =$类| | is_subclass_of ($类、用户::类);}/** *升级用户的哈希密码,通常是为了使用更好的哈希算法。* /公共函数upgradePassword(PasswordAuthenticatedUserInterface$用户、字符串$newHashedPassword):无效{//待办事项:当使用散列密码时,这个方法应该:/ / 1。将新密码保存在用户存储中/ / 2。用$user->setPassword($newHashedPassword)更新$user对象;}}
大部分工作已经完成了!阅读代码中的注释并更新TODO部分以完成用户提供程序。完成后,将用户提供程序添加到Symfony中ob娱乐下载security.yaml
:
1 2 3 4 5 6
#配置/包/ security.yaml安全:提供者:#你的用户提供者的名字可以是任何东西your_custom_user_provider:id:App \安全\ UserProvider
最后,更新配置/包/ security.yaml
文件来设置提供者
关键your_custom_user_provider
在所有将使用此自定义用户提供程序的防火墙中。