1

jdbcRealm で保護されたフォルダー secureuser および secureadmin を使用した Web アプリ プロジェクト (NetBeans 7.1.2+GlassFish 3.1.2) があります。jdbc セキュリティは通常のフォーム ログインであり、セキュリティ制約が追加されています。Glassfish デプロイメント記述子、および web.xml が通常どおり定義されています。サーブレットの設定はデフォルトの「/faces/*」です。

「localhost8080/app/faces/secureduser/」の形式の URL にアクセスしようとすると、セキュリティは期待どおりに機能します。ただし、代わりに「localhost8080/app/faces/faces/secureduser/」を使用すると、セキュリティがバイパスされます。他の保護されたフォルダーについても同じことが言えます。

セキュリティ制約で定義された URL パターンに「/faces」を追加すると、[定義されたパターンが「/faces/secureduser」の場合、「/faces/faces/secureduser」が追加される] と、常にセキュリティが上書きされるように見えます。

ログイン フォームが JSF であるか、最初のページの設計要件が少なくともセキュリティの範囲外であるため、"app/faces/" フォームのコンテキストでフィルターを使用することはできません。

ユーザーが追加のプレフィックス「/faces」を入力しても、セキュリティを維持するにはどうすればよいですか?

4

2 に答える 2

0

以下は、URL パスのマッチング方法に関する Servlet 3.0 仕様の段落です。

The first successful match is used with no further matches attempted:
  1. コンテナは、リクエストのパスとサーブレットのパスが正確に一致するものを見つけようとします。一致が成功すると、サーブレットが選択されます。
  2. コンテナは再帰的に最長のパス プレフィックスを照合しようとします。これは、パス セパレータとして「/」文字を使用して、一度に 1 ディレクトリずつパス ツリーをステップ ダウンすることによって行われます。最長一致によって、選択されるサーブレットが決まります。
  3. URL パスの最後のセグメントに拡張子 (.jsp など) が含まれている場合、サーブレット コンテナーは、拡張子の要求を処理するサーブレットを照合しようとします。拡張子は、最後の「.」の後の最後のセグメントの一部として定義されます。キャラクター。
  4. 前の 3 つのルールのいずれにもサーブレットが一致しない場合、コンテナーは要求されたリソースに適したコンテンツを提供しようとします。アプリケーションに「デフォルト」のサーブレットが定義されている場合は、それが使用されます。多くのコンテナーは、コンテンツを提供するための暗黙的なデフォルト サーブレットを提供します。

コンテナは、照合のために大文字と小文字を区別する文字列比較を使用する必要があります

したがって、完全一致はプレフィックスよりも優先され、プレフィックスは拡張よりも優先され、最終的にはユニバーサル パターンになります。

したがって、できることは/*、役割を指定せずにユニバーサル マッピングを追加するだけです。ユニバーサル マッピングは最後に一致し、ロールが指定されていない場合、誰も次のようにリソースにアクセスできません。

<security-constraint>
    <web-resource-collection>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

<!--No Authorization Required -->
<security-constraint>
    <web-resource-collection>
      <url-pattern>/faces/index.xhtml</url-pattern>
    </web-resource-collection>
</security-constraint>

<!--All roles can access -->
<security-constraint>
    <web-resource-collection>
      <url-pattern>/faces/users.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

Servlet 3.0 ドキュメントセクション 12.1 URL パスの使用を参照

于 2012-07-08T23:50:40.017 に答える
0

コードを投稿していないため、何が問題なのかわかりませんでした。次のブログを確認してください

http://jugojava.blogspot.in/2011/02/jdbc-security-realm-with-glassfish-and.html

あなたの web.xml は、ページアクセスを指定する場所です

元:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>admin</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>ADMIN</role-name>
    </auth-constraint>
</security-constraint>

上記の例では、管理者ユーザーのみが管理者フォルダー (Web ページ/管理者) の下のページにアクセスできます。

アップデート

を変えるだけで、

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

デフォルトの /faces/ を *.xhtml に変更しました。

また、security-contrainst からすべての /faces を削除すると、アクセスの問題 (/faces/faces) が解決されます。

于 2012-07-09T12:29:40.923 に答える