HttpServletRequest.getRemoteUser()vs HttpServletRequest.getUserPrincipal()。getName()

时间:2011-12-30 15:09:04

标签: java security http java-ee active-directory

这两个似乎在做同样的事情。谁能解释两者之间的主要区别?你什么时候使用一个与另一个?

HttpServletRequest.getRemoteUser()

HttpServletRequest.getUserPrincipal().getName()

3 个答案:

答案 0 :(得分:39)

Principal表示可能会对您的应用程序进行身份验证的人。 Principal的名称取决于使用的身份验证方法:

  • 用户名,例如“fred”(在HTTP基本身份验证的情况下)
  • 一个专有名称,例如“CN = bob,O = myorg”(在X.509客户端证书的情况下 - 在这种情况下可以返回X500Principal

getRemoteUser()返回“用户登录”,在HTTP基本身份验证的情况下,也将是用户名;但是,它并没有在X.509客户端证书的情况下干净地映射,因为用户没有这样输入“登录” - 在上面的示例中,我们可以使用专有名称或简单地使用CN,“bob”。

Javadocs声明“用户名是否随每个后续请求一起发送取决于浏览器和身份验证类型”,这表明getRemoteUser()最初只是为了提供数据而不是已输入用户名。但是,这会导致在使用基于cookie的身份验证时为大多数请求返回null - 不太有帮助!

实际上,getRemoteUser()通常只会调用getUserPrincipal().getName();在Tomcat 6和Jetty 6/7中验证。

答案 1 :(得分:3)

getUserPrincipal()方法返回从Principal接口派生的某个类的对象,该接口是负责请求的“用户”实体的抽象 。通过它,您将获得一个实际对象,根据实现类,您可以使用它来获取有关该用户/标识的各种信息。其中一个属性是用户/身份名称的字符串表示形式,您可以通过调用getName()获得该属性。

getRemoteUser()实际上只是获取字符串表示的捷径。您无权访问实现类实现的任何其他方法,您无权访问对象本身,只能访问名称的字符串表示。

对于我熟悉的大多数用例,字符串表示就是你想要的;我相信这就是getRemoteUser()存在的原因 - 这是一个常见的情况,所以有一种简单/快捷的方式来访问它而不实际获得对实现类对象的引用。

答案 2 :(得分:1)

有点相关的问题:

将旧的IBM Portlet API代码转换为JSR168的人必须在某些方法参数中将PortletRequest更改为HttpServletRequest,但是从WPS6.1起,他们无法将其转换为PortletRequest(它不再实现相应的接口)看起来如果他们直接在HttpServletRequest上调用“getRemoteUser”,他们就会返回null(有人说,workarround是在WAS [WebSphere Application Server]中启用应用程序安全性选项,其他人说在Web中需要更多与安全相关的标记。 XML)

workarround似乎是使用PUMA,但当然这是IBM WebSphere特定的。可能在其他Portlet容器中,如果发现getRemoteUser总是返回null,则还有其他特定于供应商的工作场所(从其他回复判断getUserPrincipal()。如果将getRemoteUser实现为该快捷方式,则getName()也返回null)。 / p> 顺便说一下,我上面提到的PUMA代码就在这里,因为在WPS6.1 +中找到有用的代码有点难:

import com.ibm.portal.portlet.service.PortletServiceHome;
import com.ibm.portal.um.*;
import com.ibm.portal.um.exceptions.PumaException;
import com.ibm.portal.puma.User;

//...

public String getCurrentUser(){
  try {
    Context ctx = new InitialContext();
    Name myjndiname = new CompositeName(PumaHome.JNDI_NAME);
    PumaHome myHome = (PumaHome) ctx.lookup(myjndiname); 
    if (myHome!=null) {
      PumaProfile pumaProfile = myHome.getProfile();
      com.ibm.portal.um.User user = (com.ibm.portal.um.User)pumaProfile.getCurrentUser();
      List attributes = new ArrayList();
      attributes.add("uid");
      Map userAttributes = pumaProfile.getAttributes(user,attributes);
      return (String) userAttributes.get("uid");
    }
  }