Comment utiliser correctement isUserInRole(rôle)
Pour empêcher un rôle d'utilisateur à partir de l'exécution d'une action.
- Exemple 1: Le rôle "administrateur"
est le seul rôle autorisés à effectuer
détruire l'action. - Exemple 2: un rôle différent de "invité" peut effectuer de CRÉER une action.
Dans un cas réel, j'ai ceci:
public String delete() {
if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){
//.....the action to perform
}
return "Denied";
}
Je souhaite que je pourrais utiliser l'annotation @RolesAllowed()
des EJB pourtant, je ne suis pas à l'aide d'EJB mais ManagedBeans.
La question est donc: Est-il possible d'utiliser de nombreux rôles en même temps? Certains solution de contournement!
Exemple: Si une action doit être autorisé à 3 rôles (administrateur, modérateur, administrateur). Je suis obligé de faire :
if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
|| FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager")
|| .....) {
//....
}
Et c'est une douleur à reproduire sur toutes les méthodes. Quelque chose comme des centaines de méthodes 🙁
OriginalL'auteur Hanynowsky | 2011-06-29
Vous devez vous connecter pour publier un commentaire.
Ce doit être contrôlée dans la vue latérale. Ne trouvez-vous pas par vous-même très ennuyeux quand vous voyez sur certains site un bouton pour lequel vous n'avez pas des droits suffisants de presse et d'obtenir ainsi un environnement intimidant page d'erreur lorsque vous le faites?
Juste rendre le bouton dans la vue de côté que lorsque l'utilisateur a le rôle nécessaire, sinon le cacher complètement.
Ce n'est pas sensible à l' (CSRF) hacks que JSF vérifie la condition, une fois encore, au cours d'appliquer les valeurs de demande de phase.
À l'aide de plusieurs conditions et de répéter la même chose encore et encore dans une vue unique, pensez à utiliser
<c:set>
pour lui donner un alias. Vous pouvez même le placer dans le haut de certains modèle de master, de sorte qu'il est disponible pour tous les enfants modèles.C'est au moins plus concis que
#{facesContext.externalContext.isUserInRole('administrator')}
🙂 Si vous avez besoin de répéter le même état à plusieurs reprises dans la même vue, vous pouvez également utiliser<ui:param>
pour lui donner un alias. Voir aussi la mise à jour de réponse.Grâce BalusC! Il est plus sage d'utiliser le modèle de master avec l'interface utilisateur:paramètre à définir de nouveaux rôles et d'éviter le piratage des méthodes d'action dans manged bean. Il fonctionne très bien pour moi maintenant, Tout ce que j'ai à faire est d'appliquer le nouveau rôle des alias en cas de besoin dans la vue. @Bozho méthode est aussi bien fonctionner pour moi si je veux vraiment montrer le refus de la page pour les non autorisé de l'utilisateur.
J'utilise moi-même déjà, mais ce n'est pas vraiment de la sécurité (ou alors j'ai loupé quelque chose), vous êtes juste à cacher un bouton/lien pour l'utilisateur, mais le haricot action peut toujours être utilisé! @BalusC, est-il une autre case que vous faites ou est-ce elle?
C'est purement côté serveur, pas côté client ou quelque chose (c'est ab-so-luth-ly aime pas JavaScript/CSS display=none/block) et il est ré-évalué par JSF lors du traitement du formulaire de soumission. Voir également le point 5 de l' stackoverflow.com/questions/2118656/... Donc, oui, vous avez certainement raté quelque chose 🙂
OriginalL'auteur BalusC
Vous pouvez raccourcir que par le déplacement de la logique à une méthode utilitaire:
Et puis l'invoquer à l':
Si vous utilisez CDI, vous pouvez faire un intercepteur qui gère le
@RolesAllowed
annotation<h:commandButton value="Delete" action="#{bean.delete}" rendered="#{AuthorizationUtils.isUserInRole('administrator','operator','manager')}" />
je suppose que je suis en train de dire des bêtises!! non?Je ne suis pas sûr si EL permettrait à cette invocation statique, mais vous pouvez créer un bean géré appelé
authBean
et de mettre cette méthode là.La méthode Utilitaire fonctionne comme un charme! Avez-vous l'esprit si j'accepte @BalusC répondre que c'est celui que je suis en adoptant dès maintenant?
OriginalL'auteur Bozho
@Mediterran81: Donc, fondamentalement, vous êtes à la recherche pour bean-méthode d'autorisation basé sur la solution...comment vous l'instanciation de votre géré haricots? Vous pouvez, comme pour introduire un simple format XML:-
Ont ce XML lire en classe utilitaire et puis la seule chose que vous devez faire est d'appeler l'Utilitaire de la méthode statique pour déterminer si la méthode est autorisé à exécuter.
Je pensais que sur l'utilisation de XML avant, mais je suis l'ordre de ne pas, et je me suis demandé à utiliser un minimum de codage de réaliser des choses. dans un ACI de l'environnement, je suis invité à jouer plutôt sur la vue en utilisant JSF vue des capacités. Cependant, j'ai voté votre réponse car je il décrit un environnement propre et lisse de manière à réaliser de méthode rôle de l'autorisation. Grâce ag112
OriginalL'auteur ag112