9

Web アプリに tomcat 基本認証を使用しています。

Web アプリの web.xml に次の行を追加しました。

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

    <user-data-constraint>
        <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE -->
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>
<security-role>
    <role-name>*</role-name>
</security-role>

私のログアウトリンク:

<h:commandLink value="Logout" action="#{userBean.logout}" />

私のログアウトリンクアクション:

public void logout() throws IOException
{
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    FacesContext.getCurrentInstance().getExternalContext().redirect("add_international_job.faces");
}

ログアウトが呼び出されると、認証が必要な別のページにリダイレクトされます。ただし、ユーザーがログインするとレンダリングされます。 PS: ユーザーが最初にアドレスバーに同じページの URL を入力すると、認証チャレンジが表示されます (そのページをパスワードで保護しても問題がないことを意味します)。 .

4

3 に答える 3

17

BASICで HTTP認証の代わりに HTTPFORM認証を使用していますj_security_checkBASIC認証は、セッションに依存しないブラウザ側からのリクエスト ヘッダーによって行われますAuthorization

認証時に「ログアウト」を強制するBASICには、サーバーは基本的に 401 応答を返す必要があります。

FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.invalidateSession();
externalContext.responseSendError(401, "You are logged out.");
facesContext.responseComplete();

のようにカスタマイズ可能な HTTP 401 エラー ページが表示さ<error-page>web.xmlます。

代わりに、メタ リフレッシュを含む HTML ページを返すこともできます。これにより、エンドユーザーは、メタ リフレッシュ ヘッダー コンテンツで指定された目的のターゲット ページにリダイレクトされます。

FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.invalidateSession();
externalContext.setResponseStatus(401);
externalContext.getResponseOutputWriter().write("<html><head><meta http-equiv='refresh' content='0;add_international_job.faces'></head></html>");
facesContext.responseComplete();

これは確かにかなり低レベルでハッキーに思えますが、BASIC認証もかなり低レベルです。FORM認証を使用する場合、これは必要ありません。セッションを無効にして通常のリダイレクトを送信するだけで、FORM認証が機能するはずです。

于 2012-05-28T15:41:18.183 に答える
0
public void logout() throws IOException {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    try {
        request.logout();
    } catch (ServletException ex) {
        throw new IOException(ex);
    }
}
于 2012-05-31T12:01:17.980 に答える