2

HttpServletRequest.getRemoteUser()短いバージョン:カスタム認証フィルターを使用しているときにユーザー名を返すにはどうすればよいですか?

長いバージョン:

現在宣言型セキュリティ (web.xml & tomcat-users.xml) を使用している Tomcat アプリケーションを変更して、代わりに (私が作成した) カスタム認証フィルター (javax.servlet.Filter から派生) を使用しています。これを行う方法については多くの情報があり、非常に簡単に見えます。

ただし、既存のアプリケーションは を呼び出しHttpServletRequest.getRemoteUser()ます。フィルターでこのプロパティを設定するために何かをしない限り、null が返されると思います。getRemoteUser()フィルターにプロパティを設定する方法に関する情報が見つかりません( はありませんsetRemoteUser())。リクエスト オブジェクトをフィルターでラップすることを推奨する投稿を見つけました。必要に応じてこれを行いますが、これを達成するためのより侵襲性の低い方法があることを願っています.

誰でも助けることができますか?

4

1 に答える 1

3

はい、HttpServletRequestまたはを変更する唯一の方法は、HttpServletResponseそれを装飾し、それらをオーバーライドすることによって、関心のあるメソッドに独自の実装を提供することです。これは認証フィルターを使用した標準パターンであり、それが目的ですHttpServletRequestWrapper(対応する応答はHttpServletResponseWrapper)。このようにして、次のように、kerberizedリクエストをラップします。

public class KerbHttpServletRequest extends HttpServletRequestWrapper
{
    private Principal myPrincipal;
    private String myAuthType;

    public KerbHttpServletRequest(HttpServletRequest aRequest,
        Principal aPrincipal,
        String aAuthType)
    {
        super(aRequest);
        myPrincipal = aPrincipal;
        myAuthType = aAuthType;
    }

    /**
     * This method returns the Remote User name as user\@domain.com.
     */
    @Override
    public String getRemoteUser()
    {
        return myPrincipal.getName();
    }

    @Override
    public String getAuthType()
    {
        return myAuthType;
    }

    @Override
    public Principal getUserPrincipal()
    {
        return myPrincipal;
    }
}
于 2012-09-16T11:02:16.623 に答える