gpt4 book ai didi

Symfony 4 - 从数据库定义自定义用户角色

转载 作者:行者123 更新时间:2023-12-02 10:26:28 24 4
gpt4 key购买 nike

我正在学习 Symfony 4,我对用户角色感到迷茫,不知道从哪里开始。因为它将是一个像网站一样的内联网,用户不会自己注册,管理员将注册他们并设置角色。管理员还可以动态创建新角色。我想将用户角色存储在数据库中。我有 2 个实体 UserRole。 (关系尚未定义,这很正常)

这是我的用户实体:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;

/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(fields="email", message="Email already taken")
* @UniqueEntity(fields="username", message="Username already taken")
*/
class User implements UserInterface, \Serializable
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", unique=true)
*/
private $id;

/**
* @ORM\Column(type="string", length=255)
*/
private $firstname;

/**
* @ORM\Column(type="string", length=255)
*/
private $lastname;

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

/**
* @ORM\Column(type="date")
*/
private $birthdate;

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

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

/**
* @Assert\NotBlank()
* @Assert\Length(max=4096)
*/
private $plainPassword;

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

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

// GETTERS

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

public function getFirstname()
{
return $this->firstname;
}

public function getLastname()
{
return $this->lastname;
}

public function getBirthdate()
{
return $this->birthdate;
}

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

public function getRoleId()
{
return $this->roleId;
}

public function getRoles()
{
return array('ROLE_USER');
}

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

public function getPlainPassword()
{
return $this->plainPassword;
}

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

public function getSalt()
{
return null;
}

// SETTERS

public function setFirstname($firstname)
{
$this->firstname = $firstname;
}

public function setLastname($lastname)
{
$this->lastname = $lastname;
}

public function setEmail($email)
{
$this->email = $email;
}

public function setBirthdate($birthdate)
{
$this->birthdate = $birthdate;
}

public function setRoleId($roleId)
{
$this->roleId = $roleId;
}

public function setUsername($username)
{
$this->username = $username;
}

public function setPlainPassword($password)
{
$this->plainPassword = $password;
}


public function setPassword($password)
{
$this->password = $password;
}

// FUNCTIONS

public function serialize()
{
return serialize(array(
$this->id,
$this->username,
$this->password,
// see section on salt below
// $this->salt,
));
}

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

public function eraseCredentials()
{

}
}

这是我的角色实体:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="App\Repository\RoleRepository")
*/
class Role
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer", unique=true)
*/
private $id;

/**
* @ORM\Column(type="string", length=255, nullable=false)
*/
private $type;

// GETTERS

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

public function getType()
{
return $this->type;
}

// SETTERS

public function setType($type): void
{
$this->type = $type;
}
}

这样做是一个好的做法吗?

在 Symfony 文档中,我们可以随处看到“宏”ROLE_USERROLE_ADMIN...它们是在哪里定义的?我们可以定制这个吗?

最佳答案

Symfony 过去通过 RoleInterface 支持角色实体,就像用户实现 UserInterface 一样。我们认为这是不必要的,因为角色表通常只包含 2 个字段(id、name),这意味着我们不妨将角色直接存储在用户表中。

因此,如果您想遵循 Symfony 最佳实践,您只需在用户中拥有自己的角色即可,例如如下所示:

class User implements UserInterface
{
/** @Column(type="json") */
private $roles = [];

public function getRoles(): array
{
return array_unique(array_merge(['ROLE_USER'], $this->roles));
}

public function setRoles(array $roles)
{
$this->roles = $roles;
}

public function resetRoles()
{
$this->roles = [];
}
}

如果您不想将角色存储为 JSON 编码字符串,您也可以使用 @Column(type="array") */或者编写自定义 DBAL 类型,例如某种 EnumType。您可能还希望保护 setter 免受无效数据的影响或添加验证。

关于文档中使用的角色的第二个问题:Symfony 对于某些功能有一些预定义的角色和伪角色:

  • IS_AUTHENTICATED_ANONYMOUSLY
  • IS_AUTHENTICATED_REMEMBERED
  • IS_AUTHENTICATED_FULLY
  • ROLE_ALLOWED_TO_SWITCH(用于用户切换)

其他角色如ROLE_USERROLE_ADMIN纯粹是示例性的,您可以根据需要使用它们。您甚至不必以ROLE_开始您自己的角色。 (尽管某些安全功能依赖于此约定,并且除非您进行一些手动更改,否则这些角色将无法按预期工作)。

关于Symfony 4 - 从数据库定义自定义用户角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48832313/

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