7

JSF を使用した Java EE での Web アプリケーションの開発。すべてのページは、アクション「j_security_check」と入力「j_username」および「j_password」を備えた認証フォームによって表示から保護されています。

ただし、ログインに成功した後、アクセスしたいページではなく、この URL にリダイレクトされます。

/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development

そのため、表示したいページではなく、すべての JS コードを含むスクリプト ファイル jsf.js を見ています。Web ルートにアクセスするか他のページにアクセスするかは関係ありません。毎回この URL にリダイレクトされます。次に、URL を任意のページに変更すると、正常に読み込まれ、ログインされます。

この問題はすでに魔法のように消えてしまったため、正しくリダイレ​​クトされたと言わざるを得ません。数週間後、再び壊れましたが、それが私のせいであったかどうかはわかりません。リダイレクトやナビゲーションのルールをまったくいじっていませんでした。

私も PrettyFaces を使用しています。

編集:

<security-constraint>
    <display-name>secured</display-name>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <description/>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>admin</role-name>
        <role-name>teacher</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <display-name>secured for admins</display-name>
    <web-resource-collection>
        <web-resource-name>admin pages</web-resource-name>
        <description/>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>
<security-constraint>
    <display-name>unsecured</display-name>
    <web-resource-collection>
        <web-resource-name>css</web-resource-name>
        <description/>
        <url-pattern>/css/*</url-pattern>
    </web-resource-collection>
    <web-resource-collection>
        <web-resource-name>js</web-resource-name>
        <description/>
        <url-pattern>/js/*</url-pattern>
    </web-resource-collection>
    <web-resource-collection>
        <web-resource-name>img</web-resource-name>
        <description/>
        <url-pattern>/img/*</url-pattern>
    </web-resource-collection>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>wetk-security</realm-name>
    <form-login-config>
        <form-login-page>/faces/login.xhtml</form-login-page>
        <form-error-page>/faces/login.xhtml</form-error-page>
    </form-login-config>
</login-config>
4

1 に答える 1

9

コンテナマネージドセキュリティは、認証チェックをトリガーした最後のHTTPリクエストにリダイレクトします。あなたの場合、それは明らかに自動インクルードされたJSF ajaxAPIJavaScriptファイルです。これは、ブラウザが認証対象のページをブラウザキャッシュから完全にロードし、ブラウザがJSファイルをサーバー側から完全にロードした場合、または条件付きGETリクエストによってJavaScriptファイルのキャッシュの有効性をテストした場合に発生する可能性があります。 。

JSFリソース(<h:outputScript><h:outputStylesheet>および<h:graphicImage>認証チェックから除外したい。一般的なURLパターンを除外することでそれを行うことができる。サフィックスパターンの代わりに明らかに使用しているプレフィックスパターン/javax.faces.resource/*のみを追加したい場合がある。/faces*.xhtml

また、制限されたページをキャッシュしないようにブラウザに指示して、ブラウザがページをキャッシュからロードしないようにする必要があります(たとえば、ログアウト後に戻るボタンを押す)。次のフィルターを、のフィルターと同じ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 httpReq = (HttpServletRequest) request;
        HttpServletResponse httpRes = (HttpServletResponse) response;

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

        chain.doFilter(request, response);
    }

    // ...
}
于 2012-06-05T18:51:26.063 に答える