認証と認可を管理するための 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 にまだ問題があります。