如何创建自定义用户提供程序
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何创建自定义用户提供程序
Symfony的ob娱乐下载部分标准身份验证过程依赖于“用户提供者”。当用户提交用户名和密码时,身份验证层要求配置的用户提供程序返回给定用户名的用户对象。ob娱乐下载然后,Symfony检查该用户的密码是否正确,并生成一个安全令牌,以便用户在当前会话期间保持身份验证。Symfony有一个“in_meob娱乐下载mory”和一个“实体”用户提供程序。在这篇文章中,您将看到如何创建自己的用户提供程序,如果您的用户是通过自定义数据库、文件或(如本例所示)web服务访问的,这将非常有用。
创建用户类
首先,不管在哪里您的用户数据来自,您将需要创建一个用户
表示该数据的类。的用户
可以随意查看并包含任何数据。唯一的要求是类实现用户界面.因此,这个接口中的方法应该在自定义用户类中定义:将getRoles ()
,getPassword ()
,getSalt ()
,getUsername ()
,eraseCredentials ()
,equals ()
.
让我们来看看实际情况:
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
/ / src / Acme / WebserviceUserBundle /安全/ User / WebserviceUser.php名称空间Acme\WebserviceUserBundle\安全\用户;使用ob娱乐下载\组件\安全\核心\用户\用户界面;类WebserviceUser实现了用户界面{私人$用户名;私人$密码;私人$盐;私人$角色;公共函数__construct($用户名,$密码,$盐数组,$角色){$这->用户名=$用户名;$这->密码=$密码;$这->盐=$盐;$这->角色=$角色;}公共函数将getRoles(){返回$这->角色;}公共函数getPassword(){返回$这->密码;}公共函数getSalt(){返回$这->盐;}公共函数getUsername(){返回$这->用户名;}公共函数eraseCredentials(){}公共函数=(用户界面$用户){如果(!$用户运算符WebserviceUser) {返回假;}如果($这->密码! = =$用户->getPassword ()) {返回假;}如果($这->getSalt () = =$用户->getSalt ()) {返回假;}如果($这->用户名= = !$用户->getUsername ()) {返回假;}返回真正的;}}
如果你有更多关于用户的信息,比如“名字”,那么你可以添加一个firstName
字段来保存该数据。
有关每种方法的详细信息,请参见用户界面.
创建用户提供者
现在你有一个用户
类,你会创建一个用户提供者,它会从某个web服务中获取用户信息,创建一个WebserviceUser
对象,并用数据填充它。
用户提供程序只是一个普通的PHP类,它必须实现UserProviderInterface,需要定义三个方法:loadUserByUsername(用户名)
,refreshUser(用户界面用户)美元
,supportsClass(类)
.详情请参见UserProviderInterface.
下面是一个例子:
12 34 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($用户名){//在这里调用你的webservice$用户数据=……//如果成功则返回一个数组,如果没有用户则返回false如果($用户数据) {$密码=“……”;/ /……返回新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/Resources/config/services.xml——> .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
在您的安全配置中,一切都集中在一起。将用户提供程序添加到“security”部分的提供程序列表中。为用户提供者选择一个名称(例如:"webservice"),并提到刚才定义的服务的id。
- YAML
- XML
- PHP
1 2 3 4 5
//应用程序/配置/ security.yml安全:提供者:网络服务:id:webservice_user_provider
1 2 3 4
<!——app/config/security.xml——> .xml<配置><提供者的名字=“网络服务”id=“webservice_user_provider”/>配置>
1 2 3 4 5 6 7 8
/ / app / config / security.php$容器->loadFromExtension (“安全”,数组(“供应商”= >数组(“网络服务”= >数组(“id”= >“webservice_user_provider”,),),));
ob娱乐下载Symfony还需要知道如何编码网站用户提供的密码,例如通过填写登录表单。你可以通过在安全配置中的“encoders”部分中添加一行来做到这一点:
- YAML
- XML
- PHP
1 2 3 4
# app / config / security.yml安全:编码器:Acme \ WebserviceUserBundle \安全\ \ WebserviceUser用户:sha512
1 2 3 4
<!——app/config/security.xml——> .xml<配置><编码器类=用户“Acme \ WebserviceUserBundle \安全\ \ WebserviceUser”>sha512编码器>配置>
1 2 3 4 5 6
/ / app / config / security.php$容器->loadFromExtension (“安全”,数组(“编码器”= >数组(“Acme用户\ WebserviceUserBundle \安全\ \ WebserviceUser '= >“sha512”,),));
这里的值应该与创建用户时最初编码的密码相对应(无论这些用户是如何创建的)。当用户提交密码时,该密码被附加到salt值,然后使用此算法进行编码,然后与由您的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/security.xml——> .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,),),));