这两个似乎在做同样的事情。谁能解释两者之间的主要区别?你什么时候使用一个与另一个?
答案 0 :(得分:39)
Principal
表示可能会对您的应用程序进行身份验证的人。 Principal的名称取决于使用的身份验证方法:
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");
}
}