Symfony 3 - Не удается правильно управлять моими пользовательскими ролями в среде PROD - PullRequest
0 голосов
/ 22 мая 2019

У меня проблема с 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), 9 раз из 10 я не могу назначить какую-либо другую роль. Но если у него есть роль, отличная от ROLE_USER, тогда я могу назначить ему любую роль. Почему не работает в препрод? Я не знаю ...

На ветке у меня есть список пользователей с опцией списка, где я выбираю новую роль. Затем он обновляет страницу. Мой запрос получает метку новой роли и ему назначается

Twig:

<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;
}

Может кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 22 мая 2019

Попробуйте исправить свой 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;
}
...