如何创建一个自定义用户提供者

编辑该页面

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

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

如何创建一个自定义用户提供者

Symfony的欧宝娱乐app下载地址标准身份验证过程的一部分取决于“用户提供者”。当用户提交一个用户名和密码,身份验证层要求配置用户提供者返回一个用户对象对于一个给定的用户名。欧宝娱乐app下载地址Symfony然后检查用户的密码是否正确并生成一个安全令牌,这样用户当前会话期间保持认证。开箱即用的,Symfony具有“欧宝娱乐app下载地址记忆”和一个“实体”用户提供者。在这个条目,你将看到如何创建自己的用户提供者,这可能是有用的,如果通过一个定制的用户访问数据库,文件,或者,如本例所示,web服务。

创建一个用户类

首先,不管在哪里来自您的用户数据,您将需要创建一个用户类,表示这些数据。的用户不过你想看,可以包含任何数据。唯一的要求就是类实现用户界面。这个接口中的方法应该中定义自定义用户类:将getRoles (),getPassword (),getSalt (),getUsername (),eraseCredentials ()。它也可能是有用的实现EquatableInterface接口,它定义了一个方法来检查用户是否等于当前用户。这个接口需要一个isEqualTo ()方法。

这就是你的WebserviceUser类看起来行动:

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
/ / src / AppBundle /安全/ User / WebserviceUser.php名称空间AppBundle\安全\用户;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;使用欧宝娱乐app下载地址\组件\安全\核心\用户\EquatableInterface;WebserviceUser实现了用户界面,EquatableInterface{私人美元用户名;私人美元密码;私人美元;私人美元角色;公共函数__construct(美元用户名,美元密码,美元数组,美元角色){美元- >用户名=美元用户名;美元- >密码=美元密码;美元- >盐=美元;美元- >角色=美元角色;}公共函数将getRoles(){返回美元- >角色;}公共函数getPassword(){返回美元- >密码;}公共函数getSalt(){返回美元- >盐;}公共函数getUsername(){返回美元- >用户名;}公共函数eraseCredentials(){}公共函数isEqualTo(用户界面美元用户){如果(!美元用户运算符WebserviceUser) {返回;}如果(美元- >密码! = =美元用户- >getPassword ()) {返回;}如果(美元- >盐! = =美元用户- >getSalt ()) {返回;}如果(美元- >用户名= = !美元用户- >getUsername ()) {返回;}返回真正的;}}

如果你有更多的信息关于你的用户——就像一个“名字”,那么你可以添加一个firstName字段来保存这些数据。

创建一个用户提供者

现在,您已经有了一个用户类,您将创建一个用户提供者,将抓住一些web服务的用户信息,创建一个WebserviceUser对象,然后用数据填充它。

用户提供程序只是一个简单的PHP类来实现UserProviderInterface,需要定义的三种方法:loadUserByUsername(用户名),refreshUser(用户界面用户)美元,supportsClass(类)。更多细节,请参阅UserProviderInterface

这里有一个例子,这可能看起来:

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
/ / src / AppBundle /安全/ User / WebserviceUserProvider.php名称空间AppBundle\安全\用户;使用AppBundle\安全\用户\WebserviceUser;使用欧宝娱乐app下载地址\组件\安全\核心\用户\UserProviderInterface;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;使用欧宝娱乐app下载地址\组件\安全\核心\异常\UsernameNotFoundException;使用欧宝娱乐app下载地址\组件\安全\核心\异常\UnsupportedUserException;WebserviceUserProvider实现了UserProviderInterface{公共函数loadUserByUsername(美元用户名){/ /打个电话到你的网络服务美元用户数据=……/ /成功假装它返回一个数组,假如果没有用户如果(美元用户数据){美元密码=“……”;/ /……返回WebserviceUser (美元用户名,美元密码,美元,美元角色);}UsernameNotFoundException (sprintf (不存在的用户名“% s”。,美元用户名));}公共函数refreshUser(用户界面美元用户){如果(!美元用户运算符WebserviceUser) {UnsupportedUserException (sprintf (不支持“% s”的实例。get_class (美元用户)));}返回美元- >loadUserByUsername (美元用户- >getUsername ());}公共函数supportsClass(美元){返回WebserviceUser::类= = =美元;}}

为用户创建一个服务提供者

现在你让用户提供者提供服务:

  • YAML
  • XML
  • PHP
1 2 3 4
# app / config / services.yml服务:app.webservice_user_provider:类:用户AppBundle \安全\ \ WebserviceUserProvider

提示

真正的实现用户的提供者可能会有一些依赖项或配置选项或其他服务。添加这些服务定义中作为参数。

修改security.yml

一切在你的安全配置。添加用户提供者提供者列表中“安全”部分。为用户提供程序(如选择一个名称。“网络服务”),提到id服务的定义。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
# app / config / security.yml安全:#……提供者:网络服务:id:app.webservice_user_provider

欧宝娱乐app下载地址Symfony还需要知道如何编码由网站用户的密码,例如通过填写一个登录表单。为此,您可以添加一行中的“编码器”一节安全配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / security.yml安全:#……编码器:AppBundle \安全\ \ WebserviceUser用户:bcrypt

然而值应符合最初的密码编码在创建用户(不过那些用户创建)。当用户提交他们的密码,使用这个编码算法和结果而你返回的密码散列getPassword ()方法。

欧宝娱乐app下载地址Symfony使用特定的方法将盐和编码密码之前比较您的编码的密码。如果getSalt ()返回什么,然后提交密码只是使用你指定的算法编码security.yml。如果一个盐创建并指定,那么下面的价值然后通过散列算法:

1
美元密码“{”美元“}”

如果你的外部用户密码咸通过不同的方法,那么你就需要做更多的工作,以便Symfony正确编码的密码。欧宝娱乐app下载地址这是超出了这个条目的范围,但将包括生成子类MessageDigestPasswordEncoder和覆盖mergePasswordAndSalt ()方法。

此外,您可以配置用于哈希密码算法的细节。在本例中,应用程序设置明确的成本bcrypt散列:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
# app / config / security.yml安全:#……编码器:AppBundle \安全\ \ WebserviceUser用户:算法:bcrypt成本:12
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。