Rendre la composante JSF basée sur le rôle de l'utilisateur

comment rendre les composants JSF basés sur le rôle d'un utilisateur connecté? Je sais que le contexte externe expose les principes, mais comment faire correctement le rendu dans JSF? En JSP, ce serait quelque chose comme

<% isUserInRole(Roles.ADMIN) { %>
<button>Edit!</button>
<% } %>

Comment puis-je écrire ceci dans JSF de la meilleure façon possible? Ma meilleure supposition est l'attribut Rendu lié à la méthode d'un haricot de soutien qui renvoie un booléen, mais qui introduirait un haricot de soutien non pertinent si je dois rendre certains éléments de navigation que pour admin...

Glassfish V3.1, JSF 2.x

15
demandé sur BalusC 2011-01-20 15:51:31

3 réponses

Si votre web.xml est déclaré comme Servlet 3.0 (qui se rapporte implicitement à JSP / EL 2.2)

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0">

ensuite, vous pouvez prendre avantage de pouvoir invoquer des méthodes avec des arguments en EL comme ExternalContext#isUserInRole():

rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}"

notez que cela nécessite un contenant capable de Servlet 3.0, mais puisque vous utilisez Glassfish 3 (qui supporte Servlet 3.0), cela devrait fonctionner sans aucun problème.

notez aussi que si vous utilisez Facelets au lieu de JSP, alors vous avez l' HttpServletRequest disponible #{request} en EL, vous permettant par la suite de plus courte de l'expression:

rendered="#{request.isUserInRole('ADMIN')}"
33
répondu BalusC 2017-05-23 12:32:16

en réponse à @wasimbhalli, il y a deux raisons pour lesquelles j'ai trouvé que l'expression retournerait toujours false:

  1. le nom du rôle est sensible à la casse. rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}" retour false, mais essayez rendered="#{facesContext.externalContext.isUserInRole('admin')}", ou rendus="#{facesContext.externalContext.isUserInRole ('Admin')}".

  2. Vous devez définir vos rôles à la fois web.xml (ou annotations) et la carte en glassfish-web.xml.

La suite est de savoir comment spécifiez un rôle dans web.ml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <security-role>
    <role-name>admin</role-name>
  </security-role>
</web-app>

voici comment associer le groupe d'authentification au rôle de glassfish-web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app>
  <security-role-mapping>
    <role-name>admin</role-name> <!-- name defined in web.xml or annotations -->
    <group-name>admin</group-name><!-- name from authentication mechanism -->
  </security-role-mapping>
</glassfish-web-app>

dans mes tests, il était nécessaire de faire le mappage même lorsque les noms étaient les mêmes, comme je le montre dans mon exemple de code. Aussi dans mes tests, j'ai essayé de définir seulement le mapping et seulement le rôle dans