web-dev-qa-db-ja.com

isUserInRole(role)を正しく使用する方法

ユーザーロールがアクションを実行しないようにするため。

  1. 例1:ロール「administrator」は、破棄アクションの実行を許可されている唯一のロールです。
  2. 例2:「guest」とは異なるロールはCREATEアクションを実行できます。

実際の場合、私はこれを持っています:

_public String delete() {
 if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){
   //.....the action to perform
 }
 return "Denied";
}
_

EJBのアノテーション@RolesAllowed()を使用できればいいのですが、EJBではなくManagedBeansを使用しています。したがって、問題は、同時に多くの役割を使用する方法はありますか?いくつかの回避策!例:アクションを3つの役割(管理者、モデレーター、マネージャー)に許可する必要がある場合。私はする義務があります:

_if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator")
    || FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager") 
    || .....) {
  //....
}
_

そして、すべての方法で再現するのは苦痛です。何百ものメソッドのようなもの:(

14
Hanynowsky

これは、ビュー側で制御する必要があります。あるサイトで、押す権利がないボタンを見て、そうすると恐ろしいエラーページが表示されるのを、自分で非常に煩わしく感じませんか?

ユーザーが必要な役割を持っている場合にのみ、ビュー側でボタンをレンダリングします。それ以外の場合は、ボタンを完全に非表示にします。

<h:commandButton value="Delete" action="#{bean.delete}" 
    rendered="#{request.isUserInRole('administrator')}" />

JSFはリクエスト値の適用フェーズでもう一度条件をチェックするため、これは(CSRF)ハッキングの影響を受けません。

複数の条件を使用し、1つのビューで同じ条件を何度も繰り返す場合は、<c:set>を使用して短いエイリアスを指定することを検討してください。マスターテンプレートの上部に配置して、すべての子テンプレートで使用できるようにすることもできます。

<c:set var="isPowerUser" value="#{request.isUserInRole('manager') or request.isUserInRole('administrator')}" scope="request" />
...
<h:commandButton rendered="#{isPowerUser}" />
...
<h:commandButton rendered="#{isPowerUser}" />
30
BalusC

ロジックをユーティリティメソッドに移動することで、これを短縮できます。

public class AuthorizationUtils {
    public static boolean isUserInRoles(String[] roles) {
        for (String role : roles) {
            if (FacesContext........isUserInRole(role)) {
                return true;
            }
        }

        return false;
    }
}

そして、それを次のように呼び出します。

if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) {
    ..
}

CDIを使用している場合は、@RolesAllowedアノテーションを処理するインターセプターを作成できます。

7
Bozho

@ Mediumran81:基本的に、Beanメソッドベースの承認ソリューションを探しています...マネージドBeanをどのようにインスタンス化していますか?単純なXML形式を導入することをお勧めします:-

<bean class="">
 <method name="">
  <role> xyz</role>
 </method>
</bean>

このXMLをユーティリティクラスで読み取らせてから、ユーティリティの静的メソッドを呼び出して、メソッドの実行が許可されているかどうかを判断するだけです。

1
ag112