经过一番努力,我能够在Symfony中实现自定义用户提供程序,但它没有按预期工作,我很难发现我出错的地方。
这是我的设置:
我创建了一个CustomUserProvider类,如下所示:
<?php
namespace XXX\AccountsBundle\Security\User;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use XXX\AccountsBundle\Entity\Accounts;
class CustomUserProvider implements UserProviderInterface
{
protected $user;
public function __contsruct (UserInterface $user) {
$this->user = $user;
}
function loadUserByUsername($username) {
$user = Accounts::find(array('email'=>$username));
if(empty($user)){
throw new UsernameNotFoundException('Could not find user. Sorry!');
}
$this->user = $user;
return $user;
}
function refreshUser(UserInterface $user) {
return $user;
}
function supportsClass($class) {
return $class === 'XXX\AccountsBundle\Entity\Accounts';
}
}
我注册了这样的服务:
parameters:
xxx_userentity.class: XXX\AccountsBundle\Entity\Accounts
xxx_userprovider.class: XXX\AccountsBundle\Security\User\CustomUserProvider
services:
userproviderentity:
class: %xxx_userentity.class%
userproviderclass:
class: %xxx_userprovider.class%
arguments: ['@userproviderentity']
我创建了这样的提供者:
providers:
main:
id: userproviderclass
我遇到的问题是,当我尝试登录时,loadUserByUsername函数中的$ username变量似乎是空的,因此我无法实现我需要的逻辑(这就是为什么我创建了一个首先是自定义用户提供商。)
我可以确认该函数实际上正在执行,因为我可以强制它上面的例外,如果它没有被执行就不会工作,所以我知道代码正在执行但是我不知道为什么当有人登录时,该变量为空。
原始(工作)设置(没有自定义用户提供程序)只使用此提供程序设置:
providers:
main:
entity:
class: XXX\AccountsBundle\Entity\Accounts
property: email
这确实有效。我的猜测是我需要以某种方式指定属性:我的提供商中的电子邮件,但我不是100%明确我应该如何做到这一点。
我感谢任何指示!