java - 使用自定义身份验证过滤器时使用 getRemoteUser() 访问用户名

标签 java servlets servlet-filters

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

长版:

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

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

有人可以帮忙吗?

最佳答案

是的,修改 HttpServletRequestHttpServletResponse 的唯一方法是修饰它并通过覆盖它们来为感兴趣的方法提供您自己的实现。这是带有身份验证过滤器的标准模式,这就是 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;
    }
}

关于java - 使用自定义身份验证过滤器时使用 getRemoteUser() 访问用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446257/

相关文章:

java - Eclipse 中的 Servlet - 放置静态内容的位置

apache - Cookie 路径总是使用 Apache Tomcat 7 而不是 Tomcat 9 引用

servlets - web.xml 顺序或过滤器和监听器

java - JUnit 测试 System.out 值

java - jvm堆空间设置

java - 使用 Selenium 检查复选框是否被选中

java - 使用 openSAML 签署响应

java - 我应该在 Servlet 的 destroy() 方法中关闭调度程序吗?

java - 排除子目录的过滤器映射 url-pattern

java - 如何在每个 Spring JSON 响应之前添加 ")]}' ,\n"以防止常见漏洞