フォームベースのコンテナ管理セキュリティでログインを再試行します
-
04-10-2019 - |
質問
Container Managed Securityを使用しているGlassfish 3.0.1に展開されたWebアプリケーションがあります。これは、jdbcrealmに対してj_security_checkを使用したシンプルな標準フォームベースの実装です。アプリケーションを確保することに関係するすべては問題ありません(そして、私は過去に自分のセキュリティシステムを転がしたとは信じられません)。
私が理解できないように思えないのは、ユーザーが間違ったパスワードを入力する場合に対処する方法です。私の「loginfailed.xhtml」ページは正しく表示されますが、ユーザーをログインページに(リンクまたは自動的に)ログインページに戻して、再試行したいと思います。
これを試したとき、login.xhtmlページへのリンクは正常に動作しますが、セキュリティシステムは、ユーザーが認証された後にユーザーを送信しようとしている場所を忘れているようです。ユーザーが正しく認証すると、システムが存在しないページをロードしようとするため、例外が表示されます(ログインページURLのマングルバージョン)。
ユーザーをホームページに戻して、そこから再試行させることができると思いますが、長い間、それほど多くのクラッジを使用したアプリケーションを見たことはありません。すべてのアイデアとヘルプに感謝します...
解決
私はあなたが単純なHTMLページでJ_Security_Checkを使用していると仮定しています、正しいですか? HTTPSERVLETREQUEST#LOGINメソッドを使用して、実際にプログラマティックログインを実行できます。
これが例です。
public String login() {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
try {
request.login(this.userName, this.password);
return "index?faces-redirect=true";
} catch (Exception e) {
return "error?faces-redirect=true";
}
したがって、ログイン後に好きな場所に送信できます。これは、ユーザー名とパスワードのメンバー変数を備えた標準のJSFバッキングビーンです。
H:CommandButtonは、このログイン方法をJSFアクションとして使用します。
他のヒント
実際、Javaのログインを管理したくない場合は、JavaScriptを使用することです。
login.html(simple htmlフォーム)
<form name="loginForm" method="POST" action="j_security_check">
<input id="username" type="text" />
<input id="password" type="password" />
<input type="submit"value="Login" />
</form>
次に、error.htmlの場合、ボディのオンロードにJavaScriptを追加するだけです
function redirect() {
window.location("http://yournewurl")
}