ユーザーロールがアクションを実行しないようにするため。
実際の場合、私はこれを持っています:
_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")
|| .....) {
//....
}
_
そして、すべての方法で再現するのは苦痛です。何百ものメソッドのようなもの:(
これは、ビュー側で制御する必要があります。あるサイトで、押す権利がないボタンを見て、そうすると恐ろしいエラーページが表示されるのを、自分で非常に煩わしく感じませんか?
ユーザーが必要な役割を持っている場合にのみ、ビュー側でボタンをレンダリングします。それ以外の場合は、ボタンを完全に非表示にします。
<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}" />
ロジックをユーティリティメソッドに移動することで、これを短縮できます。
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
アノテーションを処理するインターセプターを作成できます。
@ Mediumran81:基本的に、Beanメソッドベースの承認ソリューションを探しています...マネージドBeanをどのようにインスタンス化していますか?単純なXML形式を導入することをお勧めします:-
<bean class="">
<method name="">
<role> xyz</role>
</method>
</bean>
このXMLをユーティリティクラスで読み取らせてから、ユーティリティの静的メソッドを呼び出して、メソッドの実行が許可されているかどうかを判断するだけです。