有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (3) 个答案

  1. # 1 楼答案

    与bit相关的问题:

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

    一个工作区似乎是使用PUMA,但这当然是特定于IBM WebSphere的。如果发现getRemoteUser总是返回null(从其他回复判断,然后是getUserPrincipal()),则可能在其他Portlet容器中存在其他特定于供应商的工作区。如果将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");
        }
      }
    
  2. # 2 楼答案

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

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

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

  3. # 3 楼答案

    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中验证