3

プロジェクトにPrimeFacesを追加しようとしています。Glassfish 3フォームベースの認証で実行されています。jarファイルをダウンロードしてに入れましたWEB-INF/lib。ログイン後、次のURLのcssファイルが表示されました。

localhost:8080/[webapp]/javax.faces.resource/theme.css.jsf?ln=primefaces-aristo

セキュリティチェックを無効にしても、これは起こりません。これが私のweb.xmlのログイン部分です。

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
      <form-login-page>/login.jsf</form-login-page>
      <form-error-page>/login.jsf?failed=true</form-error-page>
    </form-login-config>
</login-config>

誰かが問題を教えてもらえますか?ありがとう!

4

3 に答える 3

4

これは、制限されたページがブラウザによってキャッシュされていることが原因です。

コンテナー管理のセキュリティは、認証チェックをトリガーした最後の HTTP 要求にリダイレクトします。あなたの場合、それはどうやら自動的に含まれる PrimeFaces テーマ CSS ファイルです。これは、ブラウザが認証対象のページをブラウザのキャッシュから完全にロードした場合、ブラウザがサーバー側から CSS ファイルを完全にロードした場合、または条件付き GET 要求によって CSS ファイルのキャッシュの有効性をテストした場合に発生する可能性があります。 . コンテナ管理のセキュリティは、この URL をログイン成功後のリダイレクト URL として正確に記憶します。

<h:outputScript>JSF リソース (と<h:outputStylesheet>を認証チェックから除外したいと考えています。<h:graphicImage>共通の URL パターン/javax.faces.resource/*.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Allowed resources</web-resource-name>
        <url-pattern>/javax.faces.resource/*</url-pattern>
    </web-resource-collection>
    <!-- No Auth Contraint! -->
</security-constraint>

また、ブラウザーが制限付きページをキャッシュからロードしないようにブラウザーに指示する必要があります(たとえば、ログアウト後に [戻る] ボタンを押すなど)。の 1 つと同じ URL パターンに次のフィルターをマップします<security-constraint>

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint>
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

    // ...
}

これにより、「戻るボタン」の問題も修正されることに注意してください。そのため、エンドユーザーは、現在のセットアップで発生するように、サインアウト/ログアウト後に戻るボタンが押されたときに、制限されたページも表示されなくなります。

于 2013-01-09T10:47:53.657 に答える
2

Webリソースを検証から除外する必要があります。たとえば<url-pattern>*.css</url-pattern><security-constraint>要素に追加します。セキュリティチェックを必要としないすべてのWebリソース(js、画像など)に対してこれを行います。

于 2013-01-09T08:18:03.533 に答える
0

セキュリティ制約に間違った URL パターンがあるようです。

動作するバージョンについては、この例をご覧ください。

http://blog.eisele.net/2011/01/jdbc-security-realm-and-form-b​​ased.html

于 2013-01-09T08:10:17.167 に答える