Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpServletRequest.getRemoteUser()vs HttpServletRequest.getUserPrincipal().getName()_Java_Security_Http_Jakarta Ee_Active Directory - Fatal编程技术网

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

Java HttpServletRequest.getRemoteUser()vs HttpServletRequest.getUserPrincipal().getName(),java,security,http,jakarta-ee,active-directory,Java,Security,Http,Jakarta Ee,Active Directory,这两个人似乎在做同样的事情。有人能解释这两者的主要区别吗?你什么时候会用一个和另一个 方法getUserPrincipal()返回从Principal接口派生的某个类的对象,该接口是负责请求的“用户”实体的抽象。从中您可以得到一个实际的对象,根据实现类的不同,您可以使用它来获取有关该用户/身份的各种信息。其中一个属性是用户/标识名称的字符串表示形式,您可以通过调用getName()获得该名称 getRemoteUser()实际上只是获取字符串表示的快捷方式。您无权访问实现类实现的任何其他方法,

这两个人似乎在做同样的事情。有人能解释这两者的主要区别吗?你什么时候会用一个和另一个

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

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


对于我熟悉的大多数用例,字符串表示就是您想要的;我相信这就是为什么
getRemoteUser()
存在的原因-这是一种常见的情况,因此有一种简单/快速的方法可以访问它,而无需实际获取对实现类对象的引用。

a
Principal
表示可能通过应用程序进行身份验证的人。主体的名称取决于所使用的身份验证方法:

  • 用户名,如“fred”(在HTTP基本身份验证的情况下)
  • 可分辨名称,如“CN=bob,O=myorg”(对于X.509客户端证书,可能返回a)
getRemoteUser()
返回“用户的登录名”,在HTTP基本身份验证的情况下,该登录名也将是用户名;但是,在X.509客户端证书案例中,它没有清晰地映射,因为用户没有输入“登录”这样的信息——在上面的示例中,我们可以使用可分辨名称,或者简单地使用CN“bob”

Javadocs声明“用户名是否随每个后续请求一起发送取决于浏览器和身份验证类型”,这表明
getRemoteUser()
最初的目的是仅为输入用户名的请求提供数据。然而,当使用基于cookie的身份验证时,这将导致它对大多数请求返回
null
,这并没有太大帮助

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

与bit相关的问题:

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

一个工作区似乎是使用PUMA,但这当然是特定于IBM WebSphere的。如果发现getRemoteUser总是返回null,则可能在其他Portlet容器中存在其他特定于供应商的工作区(从其他回复判断,然后是getUserPrincipal()。如果getRemoteUser仅作为该容器的快捷方式实现,则getName()也会返回null)

顺便说一句,我上面提到的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");
    }
  }

我在寻找更多的洞察力。两者的语义是什么…它们有什么不同。他们会给你两种不同的结果吗?它们总是一样的吗?+1这对我来说似乎很清楚。我的意思是你可以随时查看代码,但我想其中一个是从另一个派生出来的。当getUserPrincipal()不是。。。我在SpringMVC测试框架中遇到了这个问题。getUserPrincipal().getName()是正确的用法!><代码>其中一个属性是用户/标识名称的字符串表示形式,您可以通过调用getName()来获取该名称。-我不能100%确定这是否正确。您解释的内容听起来更像JAAS
Subject
类型,javaee没有公开它。主题是一袋原则,每个原则都有点像一个属性。
userPrincipal
实际上只是用户名
getName
不是指user.name,而是指主体的名称,实际上更像主体的值。不过,这是一个过于通用的接口,可能会让人相当困惑。例如,在使用SPNEGO对Active Directory或其他Kerberos源进行单点登录身份验证时返回的SpnegoPrincipal类。我正在使用的安装程序返回getRemoteUser和sAMAccountName@NTDOMAIN对于getUserPrincipal().getName()。如果我强制转换到SpnegoPrincipal,我可以调用.getRealm()并获取NT域。在本例中,getRemoteUser不是getUserPrincipal().getName()的快捷方式。对于针对Active Directory域的SPNEGO身份验证,主体的名称是sAMAccountName@NTDOMAIN而getRemoteUser()只返回sSAMAccountName。