Symfony аутентификация не работает - PullRequest
0 голосов
/ 18 мая 2018

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

Каждый раз, когда я пытаюсь получить доступ / маршрут администратора, он показывает мне http-basic login, но всякий раз, когда я ввожу "admin, admin", ничего не происходит.В моей базе данных у меня есть один пользователь с именем пользователя: admin и пароль admin, который хэшируется bcrypt.

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

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

1 Ответ

0 голосов
/ 19 мая 2018

Ваша проблема

Как уже указывалось 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...