ログインしたユーザーの役割に基づいてJSFコンポーネントをレンダリングするにはどうすればよいですか?外部コンテキストがプリンシパルを公開していることは知っていますが、JSFで適切にレンダリングするにはどうすればよいですか? JSPでは次のようになります
<% isUserInRole(Roles.ADMIN) { %>
<button>Edit!</button>
<% } %>
これをJSFで可能な限り最良の方法で書くにはどうすればよいですか?私の最善の推測は、ブール値を返すバッキングBeanのメソッドに関連付けられたrendered属性ですが、管理者専用にいくつかのナビゲーションアイテムをレンダリングする必要がある場合は、無関係なバッキングBeanが導入されます...
Glassfish V3.1、JSF 2.x
_web.xml
_がサーブレット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')}"
_
これにはサーブレット3.0対応のコンテナが必要ですが、Glassfish 3(サーブレット3.0をサポート)を使用しているため、問題なく動作するはずです。
また、JSPの代わりにFaceletsを使用している場合は、ELで_#{request}
_として使用できる HttpServletRequest
があり、次の短い式が可能であることに注意してください。
_rendered="#{request.isUserInRole('ADMIN')}"
_
@wasimbhalliに応答して、式が常にfalseを返すことがわかった理由は2つあります。
ロール名では大文字と小文字が区別されます。 rendered="#{facesContext.externalContext.isUserInRole('ADMIN')}"
はfalse
を返す場合がありますが、rendered="#{facesContext.externalContext.isUserInRole('admin')}"
を試すか、rendered = "#{facesContext.externalContext.isUserInRole( 'Admin')}"を試してください。
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
でロールを定義しようとしましたが、どちらも機能しませんでした。正しい場合に役割名を指定するので、両方が必要でした。
役割をセッション属性に格納し、レンダリングされた属性を使用してそれを比較するだけです。
例えばrendered="#{yoursessionbean.userRole == Roles.ADMIN}"