2

HttpServletRequest.getRemoteUser()简短版本:当我使用自定义身份验证过滤器时,如何返回用户名?

长版:

我正在修改当前使用声明性安全性(web.xml 和 tomcat-users.xml)的 Tomcat 应用程序,以使用自定义(由我编写)身份验证过滤器(派生自 javax.servlet.Filter)。有很多关于如何做到这一点的信息,而且看起来非常简单。

但是,现有应用程序调用HttpServletRequest.getRemoteUser(),并且我假设除非我在过滤器中设置此属性,否则它将返回 null。我找不到有关如何getRemoteUser()在过滤器中填充属性的任何信息(没有setRemoteUser())。我在那里发现了一篇帖子,建议将请求对象包装在过滤器中。如果必须,我会这样做,但我希望有一种侵入性较小的方法来实现这一点。

任何人都可以帮忙吗?

4

1 回答 1

3

是的,修改HttpServletRequestor的唯一方法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 回答