Vérifier l'appartenance d'un utilisateur à une rôle (solved)


#1

Bonjour,

Je cherche la manière de cacher/afficher un bouton de la toolbar en fonction d’une des rôles de l’utilisateur.
Sur les boutons, le showIf ne prend en compte que les query angular, de ce fait:

  • peut-on se service d’une action-attrs ou action-method ?
  • quelle type d’expression est-il possible d’utiliser (user.group?.roles?.my_role) ?

Cet exemple d’action-method pourrait-il fonctionner: <call class="com.axelor.auth.AuthSecurity" method="hasRole('role.myrole')"/> et si ou comment l’utiliser dans un action-attrs ?

Merci de votre aide


#2

Bonjour,

Pour ceux que cela pourrait interreser, j’ai réussi à obtenir le résultat escompté. Je ne sais pas si celui-ci est optimal (aucune réponse de personne à mon topic ni communauté ni Axelor Team) mais il a l’avantage de fonctionner:

  1. Dans le view, ajouter dans la définition hidden="true"
  2. créer une action-method dans laquelle le nom du rôle est spécifié:
    <action-method name="action.method.user.role.ismanager"> <call class="com.axelor.auth.AuthSecurity" method="hasRole('role.my_manager_role')"/> </action-method>
  3. créer une action-attrs appelée depuis le onNew / OnLoad de la vue
    <attribute name="hidden" expr="false" for="takeCharge" if="action:action.method.user.role.ismanager"/>

et magique, le bouton n’est affiché que si l’utilisateur à la rôle (via son groupe ou directement).


#3

Bonjour, j’aimerai faire la même chose pour le changement d’étape des opportunités.
Pour l’action attrs, tu crées bien une nouvelle action? dans dans for=" " tu mets le name du bouton à masquer?

ça ne fonctionne pas pour moi j’ai une erreur.

Peut être qu’il serait plus simple de mettre le if dans l’action appelée par le click sur le bouton pour qu’elle ne s’éxécute que si le role est manager?


#4

Bonjour,
En fait il y a plein de manière de faire. A cette époque je commençais sur l’application donc j’ai fait un peu comme j’ai pu.
Le IF de action-attr peut tout à fait être utilisé mais de mon point de vue il est préférable de masquer le bouton si l’utilisateur ne doit pas y avoir accès. En terme de UX c’est mieux que de ne rien déclencher en cas ce click.
Je te confirme que le FOR est bien le nom du bouton et le IF action-method. Par contre, il faut bien mettre le bouton en hidden=true par défaut (le bouton est masqué par défaut et ne s’affiche que quand nécessaire).


#5

Merci, je viens de réussir! Par contre, j’ai mis plusieurs conditions dans mon action-attrs et plusieurs bouttons en hidden mais ça ne fonctionne que pour un seul (next-stageBtn):

J’ai essayé de créer une action-attrs par bouton mais ça n’a pas l’air de fonctionner non plus. As-tu une idée?


#6

Bonjour,

Le plus simple pour cacher un champs/bouton/panel selon le rôle de l’utilisateur est encore de mettre en place une permission (c’est là l’intérêt principal des rôles). Dans votre rôle vous pouvez définir des permissions, et des “permissions (champs)”. Cette dernière catégorie vous permet de donner les droit de lecture (ce qui vous intéresse) d’écriture et d’export d’un champ ou d’un bouton. Il suffit de renseigner l’objet concerné et le “name” du bouton. Si vous laissez la case “lecture” décochée, cela cachera le bouton pour les utilisateurs ayant ce rôle.

Cela veut cependant dire que le comportement ne sera pas codé en dur mais bien stocké en base, ce qui vient avec ses avantages et inconvénients.


#7

Ça fonctionne pour moi merci beaucoup! Peut-on mettre une permission de champs sur un champ unique d’un champ personnalisé attrs? Par exemple le champs attrs.validation seulement et non sur les 3 autres que j’ai créé dans attrs?


#8

bon à savoir, mais cela n’est valable que pour une règle générale et pas pour une condition liée à une valeur


#9

Il est parfaitement possible d’ajouter une condition, celle-ci se remplit en javascript en éditant la “règle” inclue dans la permission.

Edit : à noter que la condition est en javascript pour les permissions de champ (car uniquement gérées côté “vue”) et en groovy pour les permissions classiques.


#10

merci pour l’info


#11

Ça fonctionne bien si je crée la permission sur le champs attrs, mais pas sur le champ attrs.validation. D’ailleurs, je ne peux pas mettre mes champs personnalisés où je veux,
<field name="attrs.validation" /> fait seulement apparaitre une image du champ en lecture seule.
On peut juste faire appel à attrs et il met tous les champs personnalisés au même endroit.