2011-01-20 62 views
15

如何基於已登錄用戶的角色呈現JSF組件?我知道外部環境暴露了主體,但我應該如何在JSF中正確渲染?在JSP中它會是類似於基於用戶角色呈現JSF組件

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

如何在JSF中以最好的方式編寫此代碼?我最好的猜測是呈現的屬性綁定到支持bean的方法,該方法返回一個布爾值,但是如果我必須爲管理員呈現某些導航項目,則會引入不相關的支持bean ...

Glassfish V3.1,JSF 2.x

+1

JSF 1.x or 2.x? – BalusC 2011-01-20 13:22:16

+0

2.x,Glassfish 3.1 – TC1 2011-01-20 13:24:34

+0

未來,請添加`[jsf-2.0]`標籤來表明:) – BalusC 2011-01-20 14:01:50

回答

31

如果您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可作爲EL #{request},讓您在以下短表達式:

rendered="#{request.isUserInRole('ADMIN')}" 
0

在會話屬性中存儲角色並僅比較使用呈現的屬性。

例如rendered="#{yoursessionbean.userRole == Roles.ADMIN}"

5

針對@wasimbhalli,有兩個原因,我發現,表達總是返回false:

  1. 角色名是區分大小寫的。 rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}"可能會返回false,但請嘗試 rendered="#{facesContext.externalContext.isUserInRole('admin')}"或呈現=「#{facesContext.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中定義角色,但都不起作用。我需要兩個,因爲在正確的情況下指定角色名稱。