webdevqa.jp.net

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

これら2つは同じことをしているようです。誰もが2つの主な違いを説明できますか?いつどちらを使用しますか?

HttpServletRequest.getRemoteUser()

HttpServletRequest.getUserPrincipal()。getName()

29
Dimitry

Principalは、アプリケーションで潜在的に認証できる人を表します。プリンシパルのnameは、使用される認証方法によって異なります。

  • 「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で検証済み。

40
SimonJ

getUserPrincipal()メソッドは、Principalインターフェイスから派生したクラスのオブジェクトを返します。これは、リクエストを処理する「ユーザー」であるエンティティのabstractionです。 。それから、実装クラスに応じて、そのユーザー/アイデンティティに関するあらゆる種類の情報を取得するために使用できる実際のオブジェクトを取得します。これらのプロパティの1つは、getName()を呼び出すことで取得するユーザー/ IDの名前の文字列表現です。

getRemoteUser()は、実際にはその文字列表現を取得するための単なるショートカットです。実装クラスによって実装されている他のメソッドにはアクセスできません。オブジェクト自体にはアクセスできません。名前の文字列表現だけにアクセスできます。

私がよく知っているほとんどのユースケースでは、その文字列表現が欲しいものです。 IbelieveこれがgetRemoteUser()が存在する理由です-これは一般的なケースですので、実際にアクセスせずに簡単にアクセスする方法があります実装クラスオブジェクトへの参照を取得します。

3
user121356

少し関連する問題:

古いIBM Portlet APIコードをJSR168に変換する人々は、いくつかのメソッドパラメーターでPortletRequestをHttpServletRequestに変更する必要がありましたが、WPS6.1以降では、PortletRequestにキャストできません(それぞれのインターフェースは見かけ上実装されていません) )そして、HttpServletRequestで「getRemoteUser」を直接呼び出すと、nullが返されます(回避策はWAS [WebSphere Application Server]でアプリケーションセキュリティオプションを有効にすることであると言う人もいれば、web.xmlでさらにセキュリティ関連のマークアップが必要であると言う人もいます)

回避策はPUMAを使用することですが、もちろんそれはIBM WebSphere固有のものです。おそらく、他のポートレットコンテナでは、getRemoteUserが常にnullを返すことがわかった場合、他のベンダー固有の回避策があります(他の応答から判断すると、getRemoteUserがそのショートカットとして実装されている場合、getUserPrincipal()。getName()もnullを返します)。

ところで、WPS6.1 +で機能するものを見つけるのは少し難しいので、上記のPUMAコードはここにあります。

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
George Birbilis