用户服务提供商

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

用户服务提供商

用户提供者(re)从一个存储加载用户(例如,数据库)基于“用户标识符”(如用户的电子邮件地址或用户名)。看到安全更详细的信息,当用户提供者使用。

欧宝娱乐app下载地址Symfony提供了几个用户提供者:

实体用户提供者
从数据库加载用户使用学说;
LDAP用户提供者
从LDAP服务器加载用户;
记忆用户提供者
加载用户配置文件;
链用户提供者
合并两个或两个以上的用户提供一个新的用户提供者。

实体用户提供者

这是最常见的用户提供者。用户存储在一个数据库和用户提供者使用学说检索它们。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/包/ security.yaml安全:提供者:用户:实体:#实体,代表用户的类类:“应用程序实体\ \用户”#属性查询,如电子邮件、用户名等属性:“电子邮件”#可选:如果您正在使用多个实体原则#经理,这个选项定义要使用哪一种# manager_name:“客户”#……

使用自定义查询加载用户

从一个实体提供者只能查询具体的字段中,指定的财产配置的关键。如果你想要更多的控制,比如你想找一个用户电子邮件用户名,你可以通过实现UserLoaderInterface在你的教义库(如。UserRepository):

1 2 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 28 29 30 31
/ / src /仓库/ UserRepository.php名称空间应用程序\存储库;使用应用程序\实体\用户;使用学说\\DoctrineBundle\存储库\ServiceEntityRepository;使用欧宝娱乐app下载地址\\学说\安全\用户\UserLoaderInterface;UserRepository扩展ServiceEntityRepository实现了UserLoaderInterface{/ /……公共函数loadUserByIdentifier(字符串美元usernameOrEmail):哦?用户{美元entityManager=美元- >getEntityManager ();返回美元entityManager- >createQuery (“选择u从用户应用\实体\ u u。用户名=:查询或u。电子邮件=:查询)- >setParameter (“查询”,美元usernameOrEmail)- >getOneOrNullResult ();}/ * *@deprecated因为Symf欧宝娱乐app下载地址ony 5.3 * /公共函数loadUserByUsername(字符串美元usernameOrEmail):哦?用户{返回美元- >loadUserByIdentifier (美元usernameOrEmail);}}

5.3

该方法loadUserByIdentifier ()被介绍给了UserLoaderInterface在Sy欧宝娱乐app下载地址mfony 5.3。

完成这个,删除财产主要从用户提供者security.yaml:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/包/ security.yaml安全:提供者:用户:实体:类:应用实体\ \用户#……

现在,每当Symfony使用欧宝娱乐app下载地址用户提供者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)。

链用户提供者

这个用户提供者结合两个或两个以上的其他提供者类型(如。实体ldap)来创建一个新用户提供者。提供者配置的顺序是很重要的,因为Symfony将寻找用户从第一个提供者和将继续寻找其他供应商,直到用户发现:欧宝娱乐app下载地址

1 2 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支持。欧宝娱乐app下载地址然而,如果你加载用户从一个定制的位置(例如,通过一个API或遗留数据库连接),您需要创建一个自定义用户提供者。

首先,确保你遵循安全指南创建您的用户类。

如果你使用了:用户命令来创建您的用户类(你回答的问题表明你需要一个自定义用户提供者),该命令将生成一个骨架开始:

1 2 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 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 70 71
/ / src /安全/ UserProvider.php名称空间应用程序\安全;使用欧宝娱乐app下载地址\组件\安全\核心\异常\UnsupportedUserException;使用欧宝娱乐app下载地址\组件\安全\核心\异常\UserNotFoundException;使用欧宝娱乐app下载地址\组件\安全\核心\用户\PasswordUpgraderInterface;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;使用欧宝娱乐app下载地址\组件\安全\核心\用户\UserProviderInterface;UserProvider实现了UserProviderInterface,PasswordUpgraderInterface{/ * * * loadUserByIdentifier()方法是在Symfony 5.3中引入的。欧宝娱乐app下载地址*在以前的版本中它被称为loadUserByUsername () * * Symfony调用这个方法如果使用像switch欧宝娱乐app下载地址_user *或remember_me特性。如果你不使用这些功能,您不需要实现该方法。* *@throwsUserNotFoundException如果用户没有找到* /公共函数loadUserByIdentifier(字符串美元标识符):用户界面{/ /加载用户从数据源对象或抛出UserNotFoundException。/ /标识符参数是美元被返回的任何值/ / getUserIdentifier()方法在用户类。\异常(“TODO:填写loadUserByIdentifier()内的__FILE__);}/ * * *刷新用户从会话后重新加载。* *当一个用户登录,在每个请求的开始,*用户从会话对象加载,然后调用这个方法是*。你的工作就是确保用户的数据仍然是新鲜的,*为例,重新查询新的用户数据。* *如果你的防火墙是“无状态:真”(纯API),这*方法不叫。* *@return用户界面* /公共函数refreshUser(用户界面美元用户){如果(!美元用户运算符用户){UnsupportedUserException (sprintf (无效的用户类“% s”。get_class (美元用户)));}/ /返回一个用户对象在确保其数据是“新鲜”。/ /或者抛出一个UserNotFoundException如果用户已不复存在。\异常(“TODO:填写refreshUser()内的__FILE__);}/ * * *告诉Sym欧宝娱乐app下载地址fony为这类用户使用这个提供者。* /公共函数supportsClass(字符串美元){返回用户::类= = =美元| | is_subclass_of (美元、用户::类);}/ * * *升级用户的密码编码,通常使用一个更好的散列算法。* /公共函数upgradePassword(用户界面美元用户、字符串美元newEncodedPassword):无效{/ /待办事项:编码的密码是在使用这个方法时,应:/ / 1。保存用户的新密码存储/ / 2。更新用户对象与用户- >美元向setPassword ($ newEncodedPassword);}}

大部分的工作已经完成了!读代码中的注释和更新待办事项部分完成用户提供者。当你完成,告诉Symfony用户提供者通过添加欧宝娱乐app下载地址它security.yaml:

1 2 3 4 5 6
#配置/包/ security.yaml安全:提供者:#用户提供者的名称可以是任何东西your_custom_user_provider:id:App \安全\ UserProvider

最后,更新配置/包/ security.yaml文件设置提供者关键your_custom_user_provider在所有的防火墙将使用这个自定义用户提供者。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode