简短版本:当我使用自定义身份验证过滤器时,如何让 HttpServletRequest.getRemoteUser()
返回用户名?
长版:
我正在修改当前使用声明性安全性(web.xml 和 tomcat-users.xml)的 Tomcat 应用程序,以改为使用自定义(由我编写)身份验证过滤器(源自 javax.servlet.Filter)。有很多关于如何执行此操作的信息,而且看起来非常简单。
但是,现有应用程序调用 HttpServletRequest.getRemoteUser()
,并且我假设除非我在过滤器中执行某些操作来设置此属性,否则它将返回 null。我找不到有关如何在过滤器中填充 getRemoteUser()
属性的任何信息(没有 setRemoteUser()
)。我找到了post out there建议将请求对象包装在过滤器中。如果有必要,我会这样做,但我希望有一种侵入性较小的方法来实现这一点。
有人可以帮忙吗?
最佳答案
是的,修改 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;
}
}
关于java - 使用自定义身份验证过滤器时使用 getRemoteUser() 访问用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446257/