2012-09-16 90 views
2

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

龙版本:

我修改目前使用的声明性安全(web.xml中&的tomcat-users.xml中),而不是使用自定义(由我写的)认证过滤器Tomcat应用程序(从衍生的javax。 servlet.Filter)。有很多关于如何做到这一点的信息,它看起来非常简单。

但是,现有的应用程序调用HttpServletRequest.getRemoteUser(),我假设除非我在过滤器中设置此属性,否则它将返回null。我无法找到有关如何在筛选器中填充getRemoteUser()媒体资源的任何信息(没有setRemoteUser())。我找到了一个post out there,建议将请求对象包装在过滤器中。如果必须的话,我会这样做,但我希望有一种侵略性较小的方法来实现这一点。

任何人都可以帮忙吗?

回答

2

是的,修改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; 
    } 
} 
+0

谢谢,看起来很容易。子问题:我看到你创建一个'Principal'并覆盖'getUserPrincipal()'。我们在这个应用程序中不使用'Principal'。如果我们不覆盖'getUserPincipal()'并且只覆盖'getRemoteUser()',我会在什么地方分手? –

+0

不,你不会(这是我的Kerberos身份验证的具体情况)。所有你感兴趣的是getRemoteUser(),只要你返回你通过运行认证协议推导出的值,这就足够了(再次假设'HttpServletRequest'的所有客户端都使用getRemoteUser()来获得用户登录)。 – Vikdor

相关问题