1

認証と認可を管理するための Authorization Listener (PhaseListener を実装する) の設定に問題があります。

具体的には、SessionBean というセッション スコープ Bean を設定します。

@ManagedBean
@SessionScoped
public class SessionBean{

   private String loggedUser;

   public SessionBean(){
    logger.info("Sono nel costruttore di SessionBean()");
   }
   public String login(){
       ....
   }
   ...
}

そして私のsun-web.xmlでは:

  <managed-bean>
    <managed-bean-name>SessionBean</managed-bean-name>
    <managed-bean-class>it.uniroma3.acme.auction.bean.SessionBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>

login() では、ユーザー名/パスワードを制御し、成功した場合は「loggedUser」を設定します。

私の AuthorizationListener は次のとおりです。

public class AuthorizationListener implements PhaseListener {

    private String currentUser;

    private SessionBean sessionBean;

    public void afterPhase(PhaseEvent event) {
        SessionBean sessionBean = (SessionBean)event.getFacesContext().getExternalContext().getSessionMap().get("SessionBean");
        String currentUser = sessionBean.getLoggedUser();

        if (sessionBean != null) {
            ...
               String currentUser = sessionBean.getLoggedUser();
        }
            else {
                 ...
            }
    }

    ...
}

そして、sun-web.xml で:

 <!-- Authentication and authorization block starting -->
    <lifecycle>
        <phase-listener>AuthorizationListener</phase-listener>
    </lifecycle>
    <navigation-rule>
        <from-view-id>/*</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>login.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
  <!-- Authentication and authorization block ending -->

しかし、null pointe sessionBean.getLoggedUser() を受け取ります。したがって、AuthorizationListener がユーザーをチェックするとき、SessionBean はまだ作成されません。これが、「SessionBeanが存在しない場合は、作成してSessionMapに入れる」を追加したが、まだ機能していない理由です。

認証と承認にこのアプローチを強制的に使用する必要はありませんが、必要なのは "session.setAttribute("username", username) を避けることです。したがって、他の戦略は本当に高く評価されます。ありがとう、アンドレア

編集:BalusC が示唆したように、afterPhase メソッドを編集しました。常に null の SessionBean にまだ問題があります。

4

2 に答える 2

3

@ManagedProperty作品は授業@ManagedBeanのみ。あなたPhaseListenerはそうではありません。

セッションマップから手動で取得する必要があります。

SessionBean sessionBean = (SessionBean) event.getFacesContext()
    .getExternalContext().getSessionMap().get("SessionBean");

それはまだnull最初の HTTP 要求にある可能性があることに注意してください。

Filterただし、一般的なアプローチは、ジョブではなくサーブレットを使用することPhaseListenerです。セッション スコープのマネージド Bean は、セッション属性として使用できます。

SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");
于 2012-09-15T17:30:13.197 に答える
0

このコードの phaseListener では、どのフェーズでコードを実装するかを正確に伝えていないため、マネージド Bean を呼び出す必要があります。これはRESTORE_VIEWPhase in AuthorizationListeneroverride methodで行う必要がありますgetPhaseId()。以下を参照してください。

public PhaseId getPhaseId() {

        return PhaseId.RESTORE_VIEW;

    }

マネージド Bean がまだ null の場合は、マネージド Bean アノテーションを削除して に登録しfaces_config、フェーズ リスナーでこのヘルパー メソッドを使用してマネージド Bean を呼び出します。

public static Object resolveExpression(String expression) {
    FacesContext ctx = FacesContext.getCurrentInstance();
    Application app = ctx.getApplication();
    ValueBinding bind = app.createValueBinding(expression);
    return bind.getValue(ctx);
}

after phase メソッドで呼び出すには、次を使用します。

public void afterPhase(PhaseEvent event) {

SessionBean sessionBean =(SessionBean)resolveExpression("#{SessionBean}");
String currentUser = sessionBean.getLoggedUser();      
于 2012-09-20T14:34:06.147 に答える