Я пишу о проблеме аутентификации 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.
Не используя аутентификацию, тогда все работает как надо, я получаю все данные из базы данных, как и должно быть после аутентификации.
Спасибо за помощь ребята!




Как уже указывал 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;
}
Ваш пользователь получает
ROLE_USER, но ему нуженROLE_ADMINдля доступа к странице