【问题标题】:Symfony 3 - Cannot correctly manage my user roles in PROD environmentSymfony 3 - 无法在 PROD 环境中正确管理我的用户角色
【发布时间】:2019-10-08 21:25:11
【问题描述】:

我在 symfony 3 上遇到问题。 我正在尝试从我创建的页面管理我的角色。 我使用的角色系统和FOSUserBundle使用的一样。

/**
 * @ORM\Column(type="array")
 */
protected $roles = [];


/**
 * Constructor
 */
public function __construct()
{
    $this->setIsActif(true);
    $this->roles = array();

}

 /**
 * {@inheritdoc}
 */
public function addRole($role)
{
    $role = strtoupper($role);
    if ($role === ['ROLE_USER']) {
        return $this;
    }

    if (!in_array($role, $this->roles, true)) {
        $this->roles[] = $role;
    }

    return $this;
}

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

/**
 * Vérifie si l'utilisateur possède le rôle passé en paramètre
 * {@inheritdoc}
 * 
 * @param string
 * @return bool
 */
public function hasRole($role)
{
    return in_array(strtoupper($role), $this->getRoles(), true);
}

/**
 * Supprimer un rôle
 * {@inheritdoc}
 * 
 * @return UserCas
 */
public function removeRole($role)
{
    if (false !== $key = array_search(strtoupper($role), $this->roles, true)) {
        unset($this->roles[$key]);
        $this->roles = array_values($this->roles);
    }

    return $this;
}

/**
 * Set roles
 * {@inheritdoc}
 * 
 * @return UserCas
 */
public function setRoles(array $roles)
{
    $this->roles = array();

    foreach ($roles as $role) {
        $this->addRole($role);
    }

    return $this;
}

/**
 * Réinitialise les rôles de l'utilisateur
 */
public function resetRoles()
{
    $this->roles = [];
}

当我处于“PREPROD”环境中时,一切正常,我的角色也发生了很好的变化。但是由于我切换到“PROD”,当我的用户没有角色(所以它自动成为 ROLE_USER)时,10 次中有 9 次,我不能分配任何其他角色。但如果他的角色不是 ROLE_USER,那么我可以为他分配任何角色。为什么它在 preprod 中不起作用?我不知道...

在树枝上,我的用户列表带有一个列表选项,我可以在其中选择新角色。然后它更新页面。我的请求检索新角色的标签并被分配

树枝:

<form action="{{path('user_role_change', {'username': unUser.username })}}" method="POST">
                        <select id="role" name="role" onChange="this.form.submit();">
                            {% for unRole in listeRoles %}
                            <option value="{{unRole}}" {% if unRole == 'User' %} selected {% endif %}>{{unRole}}</option>
                            {% endfor %}
                        </select>
                    </form>

控制器:

/**
     * Change le rôle d'un utilisateur lorsque l'on change l'option dans l'option list des rôles d'un utilisateur
     *
     * @Route("/changeRole/{username}", name="user_role_change")
     * @Method("GET")
     */
    public function changeRoleAction(Request $request, $username)
    {
        $em = $this->getDoctrine()->getManager();

        $idRole=$request->get('role');

        $user = $em->getRepository('PagesBundle:UserCas')->findOneByUsername($username); // On cherche si c'est un UserCas (user académique)

        if($user == null)
        {
            $user = $em->getRepository('PagesBundle:User')->findOneByUsername($username); // On cherche si c'est un User externe


        $nouveauRole = $this->getNouveauRole($idRole);

        $user->setRoles($nouveauRole);
        $em->persist($user);
        $em->flush();

        return $this->redirectToRoute('roles_index'); //redirection vers la page de gestion des Informations
    }



/**
 * Méthode inverse de $this->switchRole()
 * Elle renvoi le rôle en type array de sorte à ce qu'elle soit injectable dans l'attribut roles de l'utilisateur ( ex: "Admin" => "ROLE_ADMIN")
 * 
 * @param int $nomRole
 * @return array
 */
public function getNouveauRole($nomRole)
{
    switch($nomRole)
    {
        case "Admin":
            $role = ['ROLE_ADMIN'];
            break;

        case "Packages":
            $role = ['ROLE_PACKAGES'];
            break;

        case "Infos":
            $role = ['ROLE_INFOS'];
            break;

        default:
            $role = [];
            break;
    }

    return $role;
}

有人可以帮帮我吗?

【问题讨论】:

    标签: symfony roles


    【解决方案1】:

    尝试修复您的addRole() 方法,如下所示:

     /**
     * {@inheritdoc}
     */
    public function addRole($role)
    {
        $role = strtoupper($role);
        if ($role === 'ROLE_USER') {
            return $this;
        }
    
        if (!in_array($role, $this->roles, true)) {
            $this->roles[] = $role;
        }
    
        return $this;
    }
    

    【讨论】:

    • 谢谢,我解决了这个问题。这是另一种阻止我的第二个表单正确显示的表单:)
    猜你喜欢
    • 2016-12-25
    • 2019-09-24
    • 2021-03-28
    • 2019-10-09
    • 2014-09-09
    • 2019-09-12
    • 2018-09-23
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多