如何创建一个自定义用户提供者
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何创建一个自定义用户提供者
Symfony的ob娱乐下载标准身份验证过程的一部分取决于“用户提供者”。当用户提交一个用户名和密码,身份验证层要求配置用户提供者返回一个用户对象对于一个给定的用户名。ob娱乐下载Symfony然后检查用户的密码是否正确并生成一个安全令牌,这样用户当前会话期间保持认证。开箱即用的,Symfony“inob娱乐下载_memory”和一个“实体”用户提供者。在这个条目,你将看到如何创建自己的用户提供者,这可能是有用的,如果通过一个定制的用户访问数据库,文件,或者,如本例所示,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\安全\用户;使用ob娱乐下载\组件\安全\核心\用户\用户界面;使用ob娱乐下载\组件\安全\核心\用户\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
/ / src / AppBundle /安全/ User / WebserviceUserProvider.php名称空间AppBundle\安全\用户;使用ob娱乐下载\组件\安全\核心\用户\UserProviderInterface;使用ob娱乐下载\组件\安全\核心\用户\用户界面;使用ob娱乐下载\组件\安全\核心\异常\UsernameNotFoundException;使用ob娱乐下载\组件\安全\核心\异常\UnsupportedUserException;类WebserviceUserProvider实现了UserProviderInterface{公共函数loadUserByUsername(美元用户名){/ /打个电话到你的网络服务美元用户数据=……/ /成功假装它返回一个数组,假如果没有用户如果(美元用户数据){美元密码=“……”;/ /……返回新WebserviceUser (美元用户名,美元密码,美元盐,美元角色);}扔新UsernameNotFoundException (sprintf (不存在的用户名“% s”。,美元用户名));}公共函数refreshUser(用户界面美元用户){如果(!美元用户运算符WebserviceUser) {扔新UnsupportedUserException (sprintf (不支持“% s”的实例。get_class (美元用户)));}返回美元这- >loadUserByUsername (美元用户- >getUsername ());}公共函数supportsClass(美元类){返回美元类= = =“用户AppBundle \安全\ \ 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
ob娱乐下载Symfony还需要知道如何编码由网站用户的密码,例如通过填写一个登录表单。为此,您可以添加一行中的“编码器”一节安全配置:
- YAML
- XML
- PHP
1 2 3 4 5 6
# app / config / security.yml安全:#……编码器:AppBundle \安全\ \ WebserviceUser用户:bcrypt
然而值应符合最初的密码编码在创建用户(不过那些用户创建)。当用户提交他们的密码,使用这个编码算法和结果而你返回的密码散列getPassword ()
方法。