Аутентификация Symfony не работает

Я пишу о проблеме аутентификации 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);
        }

}

Это моя сущность User, и теперь ниже вы можете увидеть мой 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.

Не используя аутентификацию, тогда все работает как надо, я получаю все данные из базы данных, как и должно быть после аутентификации.

Спасибо за помощь ребята!

Ваш пользователь получает ROLE_USER, но ему нужен ROLE_ADMIN для доступа к странице

Med 18.05.2018 17:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
1
657
1

Ответы 1

Твоя проблема

Как уже указывал 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;
}

Другие вопросы по теме