Symfony身份验证不起作用

时间:2018-05-18 15:00:00

标签: symfony authentication symfony4

我正在写关于上个月发生的Symfony身份验证问题,我仍然找不到解决方案,所以我依赖你:D

namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Table(name="app_users")
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
class User implements UserInterface, \Serializable
{
  //id,username,password  

    public function getSalt()
    {
        return null;
    }

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

    public function getRoles()
    {
        return array('ROLE_USER');
    }


    public function eraseCredentials()
    {
    }


    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt,
        ));
    }

    public function unserialize($serialized)
    {
        list (
            $this->id,
            $this->username,
            $this->password,
            // see section on salt below
            // $this->salt
            ) = unserialize($serialized);
        }

}

这是我的用户实体,现在在下面你可以看到我认为我配置正确的security.yaml:

security:
    encoders:
        App\Entity\User:
              algorithm: bcrypt
    providers:
         db_provider:
              entity:
                  class: App\Entity\User
                  property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|img|js)/
            security: false
        main:
            anonymous: true
            http_basic: ~
            provider: db_provider
       access_control:
          - { path: ^/admin, roles: ROLE_ADMIN }

每当我尝试访问/ admin路由时,它都会显示http-basic login,但每当我输入" admin,admin"什么都没发生。在我的数据库中,我有一个用户名用户:admin和密码admin,由bcrypt进行哈希处理。

不使用身份验证然后一切正常,我从数据库中获取所有数据,因为它应该在身份验证之后。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的问题

正如Med已经指出的那样,您的User实体默认使用ROLE_USER角色:

/* App/Entity/User.php */

public function getRoles()
{
    return array('ROLE_USER');
}

另一方面,您的access_control配置指出只有具有/admin角色的用户才能访问路由ROLE_ADMIN

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

这意味着,您的用户" admin" 缺乏足够的角色来访问/admin

解决方案

您需要能够为用户分配多个角色。一种可能的方法是将角色保存为连接字符串并将其作为数组返回:

/* App/Entity/User.php */
/**
 * @ORM\Column(name="roles", type="string")
 * @var string
 */
private $roles;

/**
 * Get the user roles as an array of strings
 * @return array
 */
public function getRoles()
{
    return explode($roles, ',');
}

您甚至可以通过实体类添加一些方法来管理您的角色:

/* App/Entity/User.php */

/**
 * Add a new role
 * @param string $role name of the role
 * @return this
 */
public function addRole($role)
{
    $roles = $this->getRoles();
    if (array_search($role, $roles) === false) {
        $roles[] = $role;
        $this->roles = implode(',', $roles);
    }
    return $this;
}

/**
 * Remove a role
 * @param string $role name of the role
 * @return this
 */
public function removeRole($role)
{
    $roles = $this->getRoles();
    $searchResult = array_search($role, $roles);
    if ($searchResult !== false) {
        unset($roles[$searchResult]);
        $this->roles = implode(',', $roles);
    }
    return $this;
}