我正在写关于上个月发生的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进行哈希处理。
不使用身份验证然后一切正常,我从数据库中获取所有数据,因为它应该在身份验证之后。
感谢您的帮助!
答案 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;
}