質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.81%

  • Java

    12553questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSF

    118questions

    JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

  • JBoss Application Server

    10questions

    JBoss Application Server (JBoss AS)はフリーソフトウェア・オープンソースであるJava EEをベースとした、クロスプラットフォームアプリケーションサーバーです。

セキュリティ制約(security-constraint)上の画面遷移について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 411

前提・実現したいこと

お世話になっております。

WildFly上で稼働するWebシステムを開発しているのですが、
ログイン後の画面遷移に不具合があり、原因がわからず困っております。

発生している問題

ログイン時の処理を行うマネージドビーンクラスで
次の画面へリダイレクトする処理を書いており、実際その通りに画面遷移するのですが、
遷移したその画面からさらに他の画面へ遷移しようとすると(画面上のリンクのクリック)、
ログイン画面に戻されてしまいます。
(ただしブラウザのURL欄は遷移しようとした画面のURLを示しているのが謎。。)

ログイン画面以外の画面はすべて、web.xmlのsecurity-constraintに定義しているURLパターンに合致しています。

試したこと

ログイン認証のしくみはデータベース(PostgreSQL)を利用しており、
認証の機構自体は意図したとおりに動作していると思われます。
web.xmlのauth-constraintに定義されているロールのユーザでログインできますし、
定義されていないロールのユーザでログインしようとすると、503エラーで弾かれるので。

GlassFishでも試しましたが、全く同じ事象が発生しているので、
WildFlyに原因があるのではなく、基本的な設定を見落としているのかもしれません。

原因をご存じの方がいらっしゃいましたら
お知恵をお貸しいただけますでしょうか。

以上よろしくお願いいたします。

補足情報(言語/FW/ツール等のバージョンなど)

OS:Windows10
Javaバージョン:1.8.0_131
アプリケーションサーバ:WildFly 10.1.0.Final

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

思い付いた点を書かせて頂きます。
リンク表記をcommandButtonで実装し、actionで指定したBackingBeanの戻り値に該当のURLを書いてみてはどうでしょうか。CDI経由とすれば動作するのではないかという期待からです。

リンクにJSFタグ(h:link h:commandLink)を使用されてみてはどうでしょうか。

ヒントになるか判りませんが、自環境で動作しているサンプルプログラムのweb.xmlについて関連しそうな箇所を抜粋してみました。

     <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
     </servlet-mapping>
     <security-constraint>
        <display-name>testdisplay</display-name>
        <web-resource-collection>
            <web-resource-name>アプリケーション名</web-resource-name>
            <description>aaaaaaaa</description>
            <url-pattern>/faces/info/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>ログイン認証後にリソースを利用できるロール</description>
            <role-name>admin</role-name>
            <role-name>user</role-name>
        </auth-constraint>
        <user-data-constraint>
            <description>HTTPS接続する場合はCONFIDENTIALに変更する</description>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/31 18:18

    コメントありがとうございます。
    元々h:linkタグで実装していましたので、
    ご教示頂いた通り、h:commandLinkと、h:commandButtonでも試してみました。
    が、今のところ結果は変わらずです。
    もう少し色々と試してみます。

    キャンセル

  • 2017/06/01 12:32

    web.xmlのご提示ありがとうございます。
    こちらの環境との違いは、http-methodタグがないくらいですね。

    今の事象は、ログイン画面を経由せずに、(ブラウザのURL欄に直接アドレスを張り付けるなどして)直接該当の画面の表示を試みようとしたときと同じ動きに見えるので、ログインしたにも関わらず、認証されたという情報が何らかの理由で消えている?のではないかと感じています。

    キャンセル

check解決した方法

0

自己解決しました。
ログイン直後に、ログアウト処理が走っていたことが原因でした。(以下のコードのコメント行)
<!-- -->で囲っていてもEL式が評価されてしまっていたようです。JSFは詳しくないのですがそんなものなんでしょうか?
コメント行を削除したところ、正しく画面遷移が行われるようになりました。

コメントをいただきましたBlueMoon様ありがとうございました。

top.xhtmlより抜粋

            <nav class="navbar navbar-inverse">
                <a class="navbar-brand" href="#">〇〇〇〇 業務システム</a>
                <h:form class="navbar-form pull-right">
                    <p class="span2 navbar-text">#{loginSession.role.roleName}</p>
                    <p class="span2 navbar-text">#{loginSession.userAccount.userName}</p>
                    <h:commandButton class="btn btn-default" value="ログアウト" action="#{loginBean.logout()}" />
                    <!--<input type="submit" class="btn btn-default navbar-btn" jsf:value="ログアウト" jsf:action="#{loginBean.logout()}"  />-->
                </h:form>
            </nav>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    12553questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • JSF

    118questions

    JSF (JavaServer Faces)とは、JavaベースのWebアプリケーションフレームワークの一つです。

  • JBoss Application Server

    10questions

    JBoss Application Server (JBoss AS)はフリーソフトウェア・オープンソースであるJava EEをベースとした、クロスプラットフォームアプリケーションサーバーです。