2011-01-20 4 views
15

ログインしているユーザーの役割に基づいてJSFコンポーネントをレンダリングするにはどうすればよいですか?私は外部のコンテキストがプリンシパルを公開していることは知っていますが、JSFでレンダリングを適切に行うにはどうすればよいですか? JSPの場合はユーザーロールに基づくJSFコンポーネントをレンダリングする

のようになります。私はこれをJSFで可能な限り最善の方法で記述しますか?私の推測では、ブーリアンを返すバッキングBeanのメソッドにバインドされたレンダリングされた属性ですが、管理者用のナビゲーション項目をレンダリングする必要がある場合は、無関係のバッキングBeanが導入されます...

Glassfish V3.1、JSF 2.x

+1

JSF 1.xまたは2.x? – BalusC

+0

2.x、Glassfish 3.1 – TC1

+0

将来的には、それを示す '[jsf-2.0]'タグを追加してください:) – BalusC

答えて

31

あなたweb.xmlは(暗黙的JSP/EL 2.2に関連する)サーブレット3.0

<?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"> 

として宣言されている場合、あなたはExternalContext#isUserInRole()などのようなELでの引数を持つメソッドを呼び出すことができるという利点を取ることができますが:

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

これにはServlet 3.0対応コンテナが必要ですが、Glassfish 3(Servlet 3.0をサポートしています)を使用しているため、問題なく動作するはずです。

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

実際にはサーブレット3.0ですが、どういうわけか、試験セッションのこの大騒ぎの中で、私はJSFへのメソッド呼び出しを追加したことを忘れてしまいました...ありがとうございます:) – TC1

+1

それは特にJSFではなく、ELです。物事)。サーブレット2.5(JSP/EL 2.1を意味します)などでJSF 2.0を実行すると、動作しません。これはJSP/EL 2.2で導入されました。 – BalusC

+0

JDBC Realmを使用する各ユーザーのロールを定義しました。しかし、上記の式は、常に任意のユーザーに対して「false」を返します。それを動作させるために他のものを追加する必要がありますか? – wasimbhalli

0

セッション属性にロールを格納し、それをレンダリング属性を使用して比較するだけです。

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

+0

これは私のアイデアの1つですが、ユーザーは自分自身に基づいて無限の数の役割を果たすことができますグループ。ユーザーが1つの役割しか持っていなかった場合にのみ本当に機能します... – TC1

+0

@ TC1 - 同意すると、メソッド呼び出しに行くか、他の解決策が来たら待たなければなりません。 – niksvp

5

@wasimbhalliに応じて、私は式は常にfalseを返すことを発見した二つの理由があります。

  1. は、ロール名は大文字と小文字が区別されます。 rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}"は、falseを返しますが、 rendered="#{facesContext.externalContext.isUserInRole('admin')}"とするか、rendered = "#{facesContext.externalContext.isUserInRole( 'Admin')} 'を返すことがあります。

  2. web.xml(または注釈)の両方でロールを定義し、glassfish-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> 

で役割を指定する方法です。

<?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にその役割を定義するだけで、どちらも機能しませんでした。私は両方とも、正しい場合に役割名を指定する必要がありました。

関連する問題