大佬教程收集整理的这篇文章主要介绍了php-Symfony2用户提供程序必须在登录时返回UserInterface对象,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
表单运作良好,但使用UserRepository时出现问题. Symfony给我以下错误:
The user provider must return a UserInterface object.
exception 'Symfony\Component\Security\Core\Exception\AuthenticationServiceException' with message 'The user provider must return a UserInterface object.' in C:\wamp\www\PHP\Promocast\Symfony\vendor\symfony\src\Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider.PHP:101
但是,正如您在下面看到的那样,我的用户实体是由UserInterface实现的,所以我真的不明白这是什么错误.
我的用户实体:
<?PHP
namespace Promocast\UtilisateurBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
/**
* Promocast\UtilisateurBundle\Entity\ImUser
*
* @ORM\Entity(repositoryClass="Promocast\UtilisateurBundle\Entity\ImUserRepository")
*/
class ImUser implements UserInterface
{
/**
* Here all my var and getter/setter
* ...
*/
/**
* Fonctions UserInterface
*
*/
public function eraseCredentials()
{
}
public function getRoles()
{
return $this->idrole;
}
public function equals(UserInterface $user)
{
return $user->getUsername() === $this->login;
}
public function getUsername()
{
return $this->login;
}
public function getSalt()
{
return '';
}
}
我的用户存储库:
<?PHP
namespace Promocast\UtilisateurBundle\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;
class ImUserRepository extends EntityRepository implements UserProviderInterface
{
public function loadUserByUsername($login)
{
$user = $this->findBy(array("login" => $login));
if (!$user) {
throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $login));
}
return $user;
}
public function refreshUser(UserInterface $user)
{
return $this->loadUserByUsername($user->getUsername());
}
public function supportsClass($class)
{
return $class === 'Promocast\UtilisateurBundle\Entity\ImUser';
}
}
还有我的security.yml:
security:
encoders:
Promocast\UtilisateurBundle\Entity\ImUser: plaintext
#Promocast\UtilisateurBundle\Security\Provider\LoginWebService: plaintext
role_hierarchy:
ROLE_USER_SUP: ROLE_USER
ROLE_ADMIN: ROLE_USER_SUP
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_USER_SUP, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
main:
entity: { class: PromocastUtilisateurBundle:ImUser }
#entity: { class: Promocast\UtilisateurBundle\Entity\ImUser, property: login }
#id: webservice_user_provider
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login:
pattern: ^/(login$|register|resetting)
anonymous: true
main:
pattern: ^/
form_login:
login_path: /login
check_path: /login_check
username_parameter: _login
password_parameter: _password
remember_me:
key: %secret%
anonymous: true
provider: main
logout: true
logout:
path: /logout
target: /
access_control:
#- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
#- { path: ^/_internal, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 }
#- { path: /.*, role: ROLE_USER }
#- { path: /login, role: IS_AUTHENTICATED_ANONYMOUSLY }
非常感谢!
解决方法:
看来您的问题在这里:
public function loadUserByUsername($login)
{
$user = $this->findBy(array("login" => $login));
if (!$user) {
throw new UsernameNotFoundException(sprintf('No user with name "%s" was found.', $login));
}
return $user;
}
$this-> findBy()可能会返回游标/结果集,而不是您想要的一行(即使结果集仅包含一行).
尝试只使用$this-> findOneBy().
根据您的代码,您似乎正在遵循How to load Security Users from the Database (the Entity Provider)上的烹饪书教程-否则,在这种情况下,这是有用的资源.
以上是大佬教程为你收集整理的php-Symfony2用户提供程序必须在登录时返回UserInterface对象全部内容,希望文章能够帮你解决php-Symfony2用户提供程序必须在登录时返回UserInterface对象所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。