userls... ロールチェックのための VaruabkeResolver

1. VariableResolver. Javaクラスとして追加
 
package org.openntf;
 
import java.util.List;
import java.util.logging.Level;
 
import javax.faces.context.FacesContext;
import javax.faces.el.EvaluationException;
import javax.faces.el.VariableResolver;
 
import com.ibm.xsp.extlib.util.ExtLibUtil;
 
/**
 * @author Paul Withers
 *
 */
 
public class BaseVariableResolver extends VariableResolver {
 
  private final VariableResolver delegate;
 
  public BaseVariableResolver(VariableResolver resolver) {
    delegate = resolver;
  }
 
  @SuppressWarnings( { "unchecked", "finally" })
  private boolean hasRole(String roleName) {
    boolean retVal = false;
    try {
      List roles = ExtLibUtil.getCurrentDatabase().queryAccessRoles(
          ExtLibUtil.getCurrentSession().getEffectiveUserName());
      if (roles.contains("[" + roleName + "]")) {
        retVal = true;
      }
    } catch (Exception e) {
      // Add error handling
    } finally {
      return retVal;
    }
  }
 
  @Override
  public Object resolveVariable(FacesContext context, String name) throws EvaluationException {
    try {
      if (name.length() > 6 && "userIs".equals(name.substring(0, 6))) {
        return hasRole(name.substring(6));
      } else {
        return delegate.resolveVariable(context, name);
      }
    } catch (Exception e) {
      // Add error handling
      return delegate.resolveVariable(context, name);
    }
  }
 
}
 
2. faces-config.xml へのコード。 AUTOGEN セクションの前に追加。
 
  <application>
    <variable-resolver>uk.co.intec.BaseVariableResolver</variable-resolver>
  </application>
 
3. パージに Expression Language を追加。例えば、 #{userIsAdmin} は [Admin]  のロールをユーザーが持っているかをチェックできるし、SSJS 内で次のように処理可能です。 if (userIsAdmin) doSomething();





VariableResolvers は再利用できるコードとして一番速くチェックを実行します。この UserBean Vector としてすべてのロールにアクセスできますが、特定のロールをユーザーが持っているかをチェックする速くて簡単な方法はありませんでした。このコードサンプルでユーザーがロールを持っているかを true/false で返すのに「userls」にロールを追加します。例えば Expression Language として#{userIsAdmin} と記述したり、 SSJS 内のuserIsAdmin としたりできます。

さらに2つの方法で拡張可能です:
1) OSGi プラグイン内のサーバーベースのライブラリーに追加する。アプリケーションプロパティ内のライブラリーを有効化すれば、どの NSF からでもこの関数を呼び出すことが可能です。
2) 毎回 queryAccessRoles()を実行するより、一度参照と map からの取得が完了していればその値をキャッシュしておく。

Java
katoman
August 18, 2015 9:48 AM
Rating
0





No comments yetLogin first to comment...