gpt4 book ai didi

php - Symfony2 安全 - 用户 "Ibw\UserBundle\Entity\User"没有用户提供者

转载 作者:可可西里 更新时间:2023-11-01 13:54:43 26 4
gpt4 key购买 nike

我正在为我的 User 实体创建自定义实体提供程序。但是当我在登录表单中输入用户名和密码时,我得到了这个异常:

There is no user provider for user "Ibw\UserBundle\Entity\User".

当我切换回默认的 Doctrine 实体提供程序时,一切顺利。

首先这是我的security.yml:

security:
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
pattern: ^/
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
default_target_path: ibw_job_index
logout:
path: /logout
target: /

access_control:
- { path: ^/admin, roles: ROLE_ADMIN }

providers:
default_provider:
entity: { class: Ibw\UserBundle\Entity\User }

encoders:
Ibw\UserBundle\Entity\User: sha512

这是 Ibw\UserBundle\Entity\User 类:

<?php
namespace Ibw\UserBundle\Entity;

use Doctrine\Bundle\DoctrineBundle\Registry;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;

/**
* Class User
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="Ibw\UserBundle\Repository\UserRepository")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

/**
* @ORM\Column(type="string", length=25, unique=true)
*/
protected $username;

/**
* @ORM\Column(type="string", length=40)
*/
protected $salt;

/**
* @ORM\Column(type="string", length=128)
*/
protected $password;

public function __construct(ContainerInterface $container)
{
$this->isActive = true;
$this->salt = md5(uniqid(null, true));
$this->container = $container;
}

public function setUsername($username)
{
$this->username = $username;
return $this;
}

public function setPassword($password)
{
$encoder = $this->container->get('security.encoder_factory')->getEncoder($this);
$this->password = $encoder->encodePassword($password, $this->getSalt());
return $this;
}

/**
* @return Role[] The user roles
*/
public function getRoles()
{
return array('ROLE_ADMIN');
}

public function getPassword()
{
return $this->password;
}

public function getSalt()
{
return $this->salt;
}

public function getUsername()
{
return $this->username;
}

public function eraseCredentials()
{
// TODO: Implement eraseCredentials() method.
}

public function serialize()
{
return serialize(array($this->id));
}

public function unserialize($serialized)
{
list($this->id) = unserialize($serialized);
}


public function getId()
{
return $this->id;
}

public function setSalt($salt)
{
$this->salt = $salt;

return $this;
}
}

最后,这是我的 Ibw\UserBundle\Repository\UserRepository 类:

<?php

namespace Ibw\UserBundle\Repository;

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\NoResultException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;

class UserRepository extends EntityRepository implements UserProviderInterface
{

public function loadUserByUsername($username)
{
$q = $this->createQueryBuilder('u')
->select('u')
->where('u.username = :username')
->setParameter('username', $username)
->getQuery();

try
{
$user = $q->getSingleResult();
}
catch (NoResultException $e)
{
$message = sprintf('Unable to find active admin identified by %s', $username);
throw new UsernameNotFoundException($message, 0, $e);
}
return $user;
}


public function refreshUser(UserInterface $user)
{
$class = get_class($user);
if(!$this->supportsClass($user))
{
$message = sprintf('Unsupported class type : %s', $class);
throw new UnsupportedUserException($message);
}

return $this->find($user->getId());
}


public function supportsClass($class)
{
return $this->getEntityName() === $class || is_subclass_of($class, $this->getEntityName());
}
}

编辑:

我也尝试将其定义为服务,在 JobeetBundle/Resources/config/services.yml 中:

parameters:
ibw.user.provider.class: Ibw\UserBundle\Repository\UserRepository
ibw.user.provider.entity.class: Ibw\UserBundle\Entity\User

services:
ibw.user.provider:
class: %ibw.user.provider.class%
factory_service: doctrine
factory_method: getRepository
arguments:
- %ibw.user.provider.entity.class%

jobeet/app/config/security.yml 中:

providers:
default_provider:
id: ibw.user.provider
encoders:
Ibw\UserBundle\Entity\User: sha512

但不幸的是,在我发布登录表单后,它给了我完全相同的错误。

最佳答案

我在 ContextListener 类中跟踪了问题,结果发现这是一个错字!

在这里:

public function refreshUser(UserInterface $user)
{
$class = get_class($user);
if (!$this->supportsClass($user)) { //This should be $class not $user
$message = sprintf('Unsupported class type : %s', $class);
throw new UnsupportedUserException($message);
}

return $this->find($user->getId());
}

if 更改为:

if (!$this->supportsClass($class)) {}

关于php - Symfony2 安全 - 用户 "Ibw\UserBundle\Entity\User"没有用户提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19601715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com