如何创建一个自定义用户提供者
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何创建一个自定义用户提供者
Symfony的ob娱乐下载标准身份验证过程的一部分取决于“用户提供者”。当用户提交一个用户名和密码,身份验证层要求配置用户提供者返回一个用户对象对于一个给定的用户名。ob娱乐下载Symfony然后检查用户的密码是否正确并生成一个安全令牌,这样用户当前会话期间保持认证。开箱即用的,Symfony“inob娱乐下载_memory”和一个“实体”用户提供者。在这个条目,你将看到如何创建自己的用户提供者,这可能是有用的,如果通过一个定制的用户访问数据库,文件,或者,如本例所示,web服务。
创建一个用户类
首先,不管在哪里来自您的用户数据,您将需要创建一个用户
类,表示这些数据。的用户
不过你想看,可以包含任何数据。唯一的要求就是类实现用户界面。这个接口中的方法应该中定义自定义用户类:将getRoles (),getPassword (),getSalt (),getUsername (),eraseCredentials ()。它也可能是有用的实现EquatableInterface接口,它定义了一个方法来检查用户是否等于当前用户。这个接口需要一个isEqualTo ()方法。
让我们看看这个行动:
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 / Acme / WebserviceUserBundle /安全/ User / WebserviceUser.php名称空间Acme\WebserviceUserBundle\安全\用户;使用ob娱乐下载\组件\安全\核心\用户\用户界面;使用ob娱乐下载\组件\安全\核心\用户\EquatableInterface;类WebserviceUser实现了用户界面,EquatableInterface{私人美元用户名;私人美元密码;私人美元盐;私人美元角色;公共函数__construct(美元用户名,美元密码,美元盐数组,美元角色){美元这- >用户名=美元用户名;美元这- >密码=美元密码;美元这- >盐=美元盐;美元这- >角色=美元角色;}公共函数将getRoles(){返回美元这- >角色;}公共函数getPassword(){返回美元这- >密码;}公共函数getSalt(){返回美元这- >盐;}公共函数getUsername(){返回美元这- >用户名;}公共函数eraseCredentials(){}公共函数isEqualTo(用户界面美元用户){如果(!美元用户运算符WebserviceUser) {返回假;}如果(美元这- >密码! = =美元用户- >getPassword ()) {返回假;}如果(美元这- >getSalt () = =美元用户- >getSalt ()) {返回假;}如果(美元这- >用户名= = !美元用户- >getUsername ()) {返回假;}返回真正的;}}
2.1
的EquatableInterface
在Symfony 2.1中ob娱乐下载添加。使用equals ()
的方法用户界面
在Syob娱乐下载mfony 2.0。
如果你有更多的信息关于你的用户——就像一个“名字”,那么你可以添加一个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
/ / src / Acme / WebserviceUserBundle /安全/ User / WebserviceUserProvider.php名称空间Acme\WebserviceUserBundle\安全\用户;使用ob娱乐下载\组件\安全\核心\用户\UserProviderInterface;使用ob娱乐下载\组件\安全\核心\用户\用户界面;使用ob娱乐下载\组件\安全\核心\异常\UsernameNotFoundException;使用ob娱乐下载\组件\安全\核心\异常\UnsupportedUserException;类WebserviceUserProvider实现了UserProviderInterface{公共函数loadUserByUsername(美元用户名){/ /打个电话到你的网络服务美元用户数据=……/ /成功假装它返回一个数组,假如果没有用户如果(美元用户数据){美元密码=“……”;/ /……返回新WebserviceUser (美元用户名,美元密码,美元盐,美元角色);}扔新UsernameNotFoundException (sprintf (不存在的用户名“% s”。,美元用户名));}公共函数refreshUser(用户界面美元用户){如果(!美元用户运算符WebserviceUser) {扔新UnsupportedUserException (sprintf (不支持“% s”的实例。get_class (美元用户)));}返回美元这- >loadUserByUsername (美元用户- >getUsername ());}公共函数supportsClass(美元类){返回美元类= = =“Acme用户\ WebserviceUserBundle \安全\ \ WebserviceUser ';}}
为用户创建一个服务提供者
现在你让用户提供者提供服务:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
# src / Acme / WebserviceUserBundle /资源/ config / services.yml参数:webservice_user_provider.class:Acme \ WebserviceUserBundle \安全\ \ WebserviceUserProvider用户服务:webservice_user_provider:类:“% webservice_user_provider.class %”
1 2 3 4 5 6 7 8
< !——src / Acme / WebserviceUserBundle /资源/ config /服务。xml - - ><参数><参数关键=“webservice_user_provider.class”>Acme \ WebserviceUserBundle \安全\ \ WebserviceUserProvider用户< /参数>< /参数><服务><服务id=“webservice_user_provider”类=“% webservice_user_provider.class %”>< /服务>< /服务>
1 2 3 4 5 6
/ / src / Acme / WebserviceUserBundle /资源/ config / services.php使用ob娱乐下载\组件\DependencyInjection\定义;美元容器- >setParameter (“webservice_user_provider.class”,“Acme用户\ WebserviceUserBundle \安全\ \ WebserviceUserProvider ');美元容器- >setDefinition (“webservice_user_provider”,新定义(“% webservice_user_provider.class %”);
提示
真正的实现用户的提供者可能会有一些依赖项或配置选项或其他服务。添加这些服务定义中作为参数。
请注意
确保服务文件被导入。看到服务容器获取详细信息。
修改security.yml
一切在你的安全配置。添加用户提供者提供者列表中“安全”部分。为用户提供程序(如选择一个名称。“网络服务”),提到的id服务定义。
- YAML
- XML
- PHP
1 2 3 4 5
/ /应用程序/配置/ security.yml安全:提供者:网络服务:id:webservice_user_provider
1 2 3 4
< !——app / config /安全。xml - - ><配置><提供者的名字=“网络服务”id=“webservice_user_provider”/ >< /配置>
1 2 3 4 5 6 7 8
/ / app / config / security.php美元容器- >loadFromExtension (“安全”,数组(“供应商”= >数组(“网络服务”= >数组(“id”= >“webservice_user_provider”))));
ob娱乐下载Symfony还需要知道如何编码由网站用户的密码,例如通过填写一个登录表单。为此,您可以添加一行中的“编码器”一节安全配置:
- YAML
- XML
- PHP
1 2 3 4
# app / config / security.yml安全:编码器:Acme \ WebserviceUserBundle \安全\ \ WebserviceUser用户:sha512
1 2 3 4
< !——app / config /安全。xml - - ><配置><编码器类=用户“Acme \ WebserviceUserBundle \安全\ \ WebserviceUser”>sha512< /编码器>< /配置>
1 2 3 4 5 6
/ / app / config / security.php美元容器- >loadFromExtension (“安全”,数组(“编码器”= >数组(“Acme用户\ WebserviceUserBundle \安全\ \ WebserviceUser '= >“sha512”)));
然而值应符合最初的密码编码在创建用户(不过那些用户创建)。当用户提交她的密码,密码是附加到盐值,然后使用该算法编码之前相比,你返回的散列密码getPassword ()
方法。另外,根据您的选择,编码的密码可能会多次和base64编码。
细节上的密码是如何编码的
ob娱乐下载Symfony使用特定的方法将盐和编码密码之前比较您的编码的密码。如果getSalt ()
返回什么,然后提交密码只是使用你指定的算法编码security.yml
。如果一个盐是创建并指定,那么下面的价值然后通过散列算法:
美元美元密码。‘{’。盐。“}”;
如果你的外部用户密码咸通过不同的方法,那么你就需要做更多的工作,以便Symfony正确编码的密码。ob娱乐下载这是超出了这个条目的范围,但将包括生成子类MessageDigestPasswordEncoder
和覆盖mergePasswordAndSalt
方法。
此外,散列,默认情况下,多次编码和base64编码。具体细节,请参阅MessageDigestPasswordEncoder。为了避免这种情况,配置在您的配置文件:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
# app / config / security.yml安全:编码器:Acme \ WebserviceUserBundle \安全\ \ WebserviceUser用户:算法:sha512encode_as_base64:假迭代:1
1 2 3 4 5 6 7 8
< !——app / config /安全。xml - - ><配置><编码器类=用户“Acme \ WebserviceUserBundle \安全\ \ WebserviceUser”算法=“sha512”encode-as-base64=“假”迭代=“1”/ >< /配置>
1 2 3 4 5 6 7 8 9 10
/ / app / config / security.php美元容器- >loadFromExtension (“安全”,数组(“编码器”= >数组(“Acme用户\ WebserviceUserBundle \安全\ \ WebserviceUser '= >数组(“算法”= >“sha512”,“encode_as_base64”= >假,“迭代”= >1))));