2

大家好,我想了解 symfony 中关于用户和用户角色的逻辑以及它的工作原理。我是 symfony 的新手,我遵循本教程: http ://symfony.com/doc/current/security/entity_provider.html

在我的项目中一切正常,但是当我查看数据库时,我有user表格和所有用户,我注册的内容就像表格中的数据一样。

但是用户角色表在哪里?symfony 如何知道谁是ROLE_ADMIN谁,谁是谁ROLE_MODERATOR。如何实现所有用户具有特定角色并将该角色保存在数据库中,以便稍后我可以从某个管理面板更改它?ACL 可能吗?

4

2 回答 2

6

Symfony 不负责存储您的角色。例如,如果您需要管理它们,则必须存储它们,例如使用管理控制台。

Symfony\Component\Security\Core\User\UserInterface您的用户实体实现的接口包含一个方法名称getRoles,该方法名称应返回代表用户角色的字符串数组Symfony\Component\Security\Core\Role\RoleInterface或. 因此,您可以在项目中创建一个名为Roleimplements的实体Symfony\Component\Security\Core\Role\RoleInterface。然后将该实体链接到您的 User 实体抛出一个ManyToMany关联。最后实现 getRoles 方法,该方法应该返回给定用户的角色。

然后,您可以像管理项目中的任何其他实体一样管理您的角色。

于 2016-10-06T11:57:01.983 回答
3

RoleInterface 现在已被弃用,将在 4.0 中删除,因此您可以像 Genoud Magloire 所说的那样做,但一定要扩展 Symfony\Component\Security\Core\Role\Role

这是我的角色实体的示例。

<?php

namespace ExampleCoreBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\Role\Role;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * ExampleRole
 *
 * @ORM\Table(name="EXAMPLE_ROLE")
 * @ORM\Entity
 */
class ExampleRole extends Role
{
    /**
     * @var integer
     *
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     */
    private $id;

    /**
     * @var string
     *
     * @Assert\NotBlank()
     * @Assert\Length(
     *      min = 9,
     *      max = 100,
     *      minMessage = "Role name must be at least {{ limit }} characters long",
     *      maxMessage = "Role name cannot be longer than {{ limit }} characters"
     * )
     * @ORM\Column(name="ROLE_NAME", type="string", length=255, nullable=false, unique=true)
     *
     */
    private $roleName;

    /**
     * @var string
     *
     * @Assert\NotBlank()
     * @Assert\Choice({"Y","N"})
     *
     * @ORM\Column(name="GRANTABLE", type="string", length=1, nullable=false)
     */
    private $grantable;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="CREATED_ON", type="datetime", nullable=false)
     */
    private $createdOn;

    //...and so on with whatever else you want to save. 

    public function __construct( $roleName = null )
    {
        parent::__construct( $roleName );
    }
于 2017-11-06T15:48:25.933 回答