Symfony 使用 AdvancedUserInterface

问题描述 投票:0回答:2

我正在尝试使用 Symfony2 实现登录系统。我正在为我的用户实体实现 AdvancedUserInterface,并在尝试登录时不断收到以下错误。感谢任何帮助。

错误:

$user must be an instanceof UserInterface, an object implementing a __toString method, or a primitive string.

用户实体:

<?php

namespace Flc\UserBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;
use Serializable;

/**
* User
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="Flc\UserBundle\Entity\UserRepository")
*/
class User implements AdvancedUserInterface, Serializable {

/**
 * @var integer
 *
 * @ORM\Column(name="userId", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $userId;

/**
 * @var string
 *
 * @ORM\Column(name="userEmail", type="string", length=50)
 */
private $userEmail;

/**
 * @var string
 *
 * @ORM\Column(name="userName", type="string", length=20)
 */
private $userName;

/**
 * @var string
 *
 * @ORM\Column(name="userPassword", type="string", length=60)
 */
private $userPassword;

/**
 * @var string
 *
 * @ORM\Column(name="userSalt", type="string", length=60, nullable=true)
 */
private $userSalt;

/**
 * @var string
 *
 * @ORM\Column(name="userFirstName", type="string", length=40)
 */
private $userFirstName;

/**
 * @var string
 *
 * @ORM\Column(name="userLastName", type="string", length=40)
 */
private $userLastName;

/**
 * @var string
 *
 * @ORM\Column(name="userPhone", type="string", length=10)
 */
private $userPhone;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="created", type="datetime")
 */
private $created;

/**
 * @var boolean
 *
 * @ORM\Column(name="isActive", type="boolean")
 */
private $isActive;

/**
 * @var array
 *
 * @ORM\Column(name="roles", type="json_array", nullable=true)
 */
private $roles;

#########################
## GETTER - SETTER FUNCTIONS ##
#########################

/**
 * Get userId
 *
 * @return integer 
 */
public function getUserId() {
    return $this->userId;
}

/**
 * Set userEmail
 *
 * @param string $userEmail
 * @return User
 */
public function setUserEmail($userEmail) {
    $this->userEmail = $userEmail;

    return $this;
}

/**
 * Get userEmail
 *
 * @return string 
 */
public function getUserEmail() {
    return $this->userEmail;
}

/**
 * Set userName
 *
 * @param string $userName
 * @return User
 */
public function setUserName($userName) {
    $this->userName = $userName;

    return $this;
}

/**
 * Get userName
 *
 * @return string 
 */
public function getUserName() {
    return $this->userName;
}

/**
 * Set userPassword
 *
 * @param string $userPassword
 * @return User
 */
public function setUserPassword($userPassword) {
    $this->userPassword = $userPassword;

    return $this;
}

/**
 * Get userPassword
 *
 * @return string 
 */
public function getUserPassword() {
    return $this->userPassword;
}

/**
 * Set userSalt
 *
 * @param string $userSalt
 * @return User
 */
public function setUserSalt($userSalt) {
    $this->userSalt = $userSalt;

    return $this;
}

/**
 * Get userSalt
 *
 * @return string 
 */
public function getUserSalt() {
    return $this->userSalt;
}

/**
 * Set userFirstName
 *
 * @param string $userFirstName
 * @return User
 */
public function setUserFirstName($userFirstName) {
    $this->userFirstName = $userFirstName;

    return $this;
}

/**
 * Get userFirstName
 *
 * @return string 
 */
public function getUserFirstName() {
    return $this->userFirstName;
}

/**
 * Set userLastName
 *
 * @param string $userLastName
 * @return User
 */
public function setUserLastName($userLastName) {
    $this->userLastName = $userLastName;

    return $this;
}

/**
 * Get userLastName
 *
 * @return string 
 */
public function getUserLastName() {
    return $this->userLastName;
}

/**
 * Set userPhone
 *
 * @param string $userPhone
 * @return User
 */
public function setUserPhone($userPhone) {
    $this->userPhone = $userPhone;

    return $this;
}

/**
 * Get userPhone
 *
 * @return string 
 */
public function getUserPhone() {
    return $this->userPhone;
}

/**
 * Set created
 *
 * @param \DateTime $created
 * @return User
 */
public function setCreated($created) {
    $this->created = $created;

    return $this;
}

/**
 * Get created
 *
 * @return \DateTime 
 */
public function getCreated() {
    return $this->created;
}

/**
 * Set isActive
 *
 * @param boolean $isActive
 * @return User
 */
public function setIsActive($isActive) {
    $this->isActive = $isActive;

    return $this;
}

/**
 * Get isActive
 *
 * @return boolean 
 */
public function getIsActive() {
    return $this->isActive;
}

/**
 * Set roles
 *
 * @param boolean $roles
 * @return User
 */
public function setRoles(array $roles) {
    $this->roles = $roles;

    return $this;
}

#############################################
## USER INTERFACE FUNCTIONS IMPLEMENTATION ##
#############################################

public function getRoles() {
    #return $this->roles;

    $roles = $this->roles;
    $roles[] = 'ROLE_USER';

    return array_unique($roles);
}

public function eraseCredentials() {
    //will be implemented
}

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

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

public function isAccountNonExpired() {
    return true;
}

public function isAccountNonLocked() {
    return true;
}

public function isCredentialsNonExpired() {
    return true;
}

public function isEnabled() {
    return $this->isActive;
}

#####################################################
## SERIALIZABLE INTERFACE FUNCTIONS IMPLEMENTATION ##
#####################################################

public function serialize() {
    return serialize(array(
        $this->userId,
        $this->userName,
        $this->userPassword
    ));
}

public function unserialize($serialized) {
    list(
            $this->userId,
            $this->userName,
            $this->userPassword) = unserialize($serialized);
}
}

用户存储库:

<?php
namespace Flc\UserBundle\Entity;

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

/**
 * UserRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class UserRepository extends EntityRepository implements UserProviderInterface {

public function findOneByUsernameOrEmail($username) {
    return $this->createQueryBuilder('u')
                    ->andWhere('u.userName = :username OR u.userEmail = :email')
                    ->setParameter('username', $username)
                    ->setParameter('email', $username)
                    ->getQuery()
                    ->getOneOrNullResult();
}

public function loadUserByUsername($username) {
    //$user = $this->findOneByUsernameOrEmail($username);
    $user = $this->findOneBy(array("userName"=>$username));
    if (!$user) {
        throw new UsernameNotFoundException('No user found for ' . $username);
    }
    return $user;
}

public function refreshUser(UserInterface $user) {
    $class = get_class($user);

    if (!$this->supportsClass($class)) {
        throw new UnsupportedUserException(sprintf(
                'Instances of "%s" are not supported.', $class
        ));
    }

    if (!$refreshedUser = $this->find($user->getUserId())) {
        throw new UsernameNotFoundException(sprintf('User with id %s not found'), json_encode($refreshedUser));
    }
}

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

安全YML:

security:
encoders:
    Flc\UserBundle\Entity\User: bcrypt

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

providers:
    flc_users:
        entity: { class: FlcUserBundle:User }

firewalls:
    secured_area:
        pattern: ^/
        form_login:
            login_path: login_form
            check_path: login_check
        logout:
            path:   logout
            target: /
        anonymous: ~

access_control:
    - { path: ^/app, roles: ROLE_USER }
php authentication symfony doctrine
2个回答
0
投票

尝试在您的用户实体上添加

__toString
方法:

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

0
投票

在用户存储库中,您需要替换:

public function findOneByUsernameOrEmail($username) {
    return $this->createQueryBuilder('u')
                    ->andWhere('u.userName = :username OR u.userEmail = :email')
                    ->setParameter('username', $username)
                    ->setParameter('email', $username)
                    ->getQuery()
                    ->getOneOrNullResult();
}

public function loadUserByUsername($username) {
    //$user = $this->findOneByUsernameOrEmail($username);
    $user = $this->findOneBy(array("userName"=>$username));
    if (!$user) {
        throw new UsernameNotFoundException('No user found for ' . $username);
    }
    return $user;
}

与:

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

    try {
        $user = $q->getSingleResult();
    } catch (NoResultException $e) {
        throw new UsernameNotFoundException(sprintf('Unable to find an active admin AcmeUserBundle:User object identified by "%s".', $username), 0, $e);
    }

    return $user;
}
© www.soinside.com 2019 - 2024. All rights reserved.