Визуализация компонента JSF на основе роли пользователя - PullRequest
15 голосов
/ 20 января 2011

Как мне рендерить компоненты JSF на основе авторизованной роли пользователя?Я знаю, что внешний контекст раскрывает принципы, но как мне правильно сделать рендеринг в JSF?В JSP это будет что-то вроде

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

Как мне написать это в JSF наилучшим образом?Мое лучшее предположение - это визуализированный атрибут, связанный с методом поддерживающего бина, который возвращает логическое значение, но он привел бы к неактуальному вспомогательному бину, если бы мне пришлось отображать некоторые элементы навигации только для администраторов ...

Glassfish V3.1, JSF 2.x

Ответы [ 3 ]

34 голосов
/ 20 января 2011

Если ваш web.xml объявлен как Servlet 3.0 (что неявно относится к 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">

, тогда вы можете воспользоваться возможностью вызывать методы с аргументами в EL, такими как ExternalContext#isUserInRole():

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

Обратите внимание, что для этого требуется контейнер с поддержкой Servlet 3.0, но поскольку вы используете Glassfish 3 (который поддерживает Servlet 3.0), он должен работать без каких-либо проблем.

Также обратите внимание, что если вы используете Facelets вместо JSP, то у вас есть HttpServletRequest, доступный как #{request} в EL, что позволяет использовать следующее более короткое выражение:

rendered="#{request.isUserInRole('ADMIN')}"
5 голосов
/ 13 апреля 2012

В ответ на @wasimbhalli я обнаружил, что есть две причины, по которым выражение всегда будет возвращать false:

  1. Имя роли чувствительно к регистру.rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}" может вернуть false, но попробуйте rendered="#{facesContext.externalContext.isUserInRole('admin')}" или отрендерено = "# {FaceContext.externalContext.isUserInRole ('Admin')}".

  2. Вы должны определитьваши роли как в web.xml (или в виде аннотаций), так и в соответствии с glassfish-web.xml.

Ниже описано, как указать роль в 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>

Ниже показано, как сопоставить группу аутентификации с ролью в 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>

В моем тестировании было необходимо выполнить сопоставление, даже когда имена были одинаковыми, как я показываюв моем примере кода.Также в своем тестировании я пытался определить только отображение и только определить роль в web.xml, но ни один из них не сработал.Мне нужно было и то и другое, как указание имени роли в правильном регистре.

0 голосов
/ 20 января 2011

Сохраните роль в атрибуте сеанса и просто сравните ее с использованием предоставленного атрибута.

Например, rendered="#{yoursessionbean.userRole == Roles.ADMIN}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...