gpt4 book ai didi

php - Symfony 4 Doctrine,如何从数据库中加载用户角色

转载 作者:行者123 更新时间:2023-12-04 03:00:03 24 4
gpt4 key购买 nike

Symfony 的新手。如何使用 Doctrine 从数据库加载当前登录用户的角色。我有 3 张 table 像这样布置。
users => (user_id, username, password, email)
user_roles => (id,user_id,role_id)
roles => (role_id, role_name)

我有每个表的实体及其相应的存储库。

我的 security.yaml 看起来像这样。

security:
encoders:
App\Entity\User:
algorithm: bcrypt

providers:
our_db_provider:
entity:
class: App\Entity\User
property: username
# if you're using multiple entity managers
# manager_name: customer

firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
# pattern: ^/
# http_basic: ~
provider: our_db_provider
anonymous: true
form_login:
#login_path is GET request used ti display the form
# needs to be route names(alias) not the path.
login_path: login

#check_path is a POST request
check_path: logincheck
use_forward: true

default_target_path: default
always_use_default_target_path: true

我的 Entity/User实现 UserInterface组件,通过阅读文档,我了解到 getRoles()方法负责更新用户角色。我创建了一个名为 getUserRoles($id) 的自定义方法在我的 UserRolesRepository.php我设法返回了当前用户角色的字符串数组,但是我无法从 Entity 访问此方法.我知道我不应该从 Entity 类中访问 Repository 方法,但我在这个阶段陷入了困境。所以现在我的 getRoles()方法返回静态数组 return array('ROLE_ADMIN', 'ROLE_EDITOR');
我的 User实体类
namespace App\Entity;

use App\Repository\UserRepository;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use App\Repository\UserRolesRepository;
use Doctrine\ORM\EntityRepository;
use App\Services\Helper;

/**
* @ORM\Table(name="`user`")
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string", length=25, nullable=true)
*/
private $username;

/**
* @ORM\Column(type="string", length=64, nullable=true)
*/
private $password;

/**
* @ORM\Column(type="string", length=254, nullable=true)
*/
private $email;

/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $isActive;

private $roles;

/**
* @ORM\Column(type="string", length=254, nullable=true)
*/
private $role;

public function __construct()
{
$this->isActive = true;
}

/**
* @return mixed
*/
public function getRole()
{
return $this->role;
}

/**
* @param mixed $role
*/
public function setRole($role)
{
$this->role = $role;
}

public function getId()
{
return $this->id;
}

public function getUsername(): ?string
{
return $this->username;
}

public function setUsername(?string $username): self
{
$this->username = $username;

return $this;
}

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

public function setPassword(?string $password): self
{
$this->password = $password;

return $this;
}

public function getEmail(): ?string
{
return $this->email;
}

public function setEmail(?string $email): self
{
$this->email = $email;

return $this;
}

public function getIsActive(): ?bool
{
return $this->isActive;
}

public function setIsActive(?bool $isActive): self
{
$this->isActive = $isActive;

return $this;
}


//return is required or else returns an fatal error.
public function getRoles()
{
return array('ROLE_ADMIN','ROLE_EDITOR');
}

public function eraseCredentials()
{
// TODO: Implement eraseCredentials() method.
}

public function serialize()
{
// TODO: Implement serialize() method.
return serialize(array(
$this->id,
$this->username,
$this->password,
));
}

/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
list (
$this->id,
$this->username,
$this->password,
// see section on salt below
// $this->salt
) = unserialize($serialized, ['allowed_classes' => false]);
}

public function getSalt()
{
// TODO: Implement getSalt() method.
return null;
}
}

最佳答案

到目前为止,您还没有根据您的数据库结构将您的用户映射到角色。

private $roles;

没有关于它如何映射到角色表的信息。它应该看起来像:
/**
* @var Collection|Role[]
* @ORM\ManyToMany(targetEntity="Role")
* @ORM\JoinTable(
* name="user_roles",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
* )
*/
private $roles;

您还需要在构造中创建一组初始角色,以便 getRoles不会抛出错误,因此可以根据需要将角色一一添加到新用户:
public function __construct()
{
$this->isActive = true;
$this->roles = new ArrayCollection();
}

您可以删除 getRole()setRole()因为我们没有单一角色(除非界面需要),并且您可能会丢失当前的 $role属性(property):
/**
* @ORM\Column(type="string", length=254, nullable=true)
*/
private $role;

但添加一个接受集合的 setter :
public function setRoles(Collection $roles)
{
$this->roles = $roles;
}

然后获取角色:
public function getRoles()
{
return $this->roles->toArray();
}

如果您使用表单来创建用户(尤其是奏鸣曲管理员),除了从用户中添加和删除单个角色之外,您还可以使用以下方法(它将删除用户和角色之间的关系,而不是角色本身):
public function addRole(Role $role)
{
$this->roles->add($role);
}

还有一个删除角色:
public function removeRole(Role $role)
{
$this->roles->removeElement($role);
}

关于php - Symfony 4 Doctrine,如何从数据库中加载用户角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50044902/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com