質問
がわかりやすく伝えるためのセッション管理やセキュリティprogramatically、ニュージャージー州の例web-applicationセッション管理すれば良いのだろうか。又は取引、セッション、セキュリティ取り扱うすべてのコンテナによるジャージーの応用展開され?
解決
セッション管理ジャージーが配備された容器の範囲です。ほとんどの生産のケースでは、セッション管理を行い、コンテナ内に配備されます。
以下のコードは、セッションのセッションオブジェクト格納値を取得し、後続の呼び出しにそれらを取得ジャージリソースの簡単な例である。
@Path("/helloworld")
public class HelloWorld {
@GET
@Produces("text/plain")
public String hello(@Context HttpServletRequest req) {
HttpSession session= req.getSession(true);
Object foo = session.getAttribute("foo");
if (foo!=null) {
System.out.println(foo.toString());
} else {
foo = "bar";
session.setAttribute("foo", "bar");
}
return foo.toString();
}
}
他のヒント
私はセッションが、我々はを決しての中に使用してはならない何かであることを考えました RESTfulなアプリケーション...
Yegorは正しいです。私たちは、サーバー側ののア・ラ・の従来のWebアプリケーションの状態を維持することはありませんではないはずです。あなたは切り離されたSOA指向のアプリケーションを構築したい場合は、REST Webサービスのための任意のAPI /フレームワークを使用する必要はありません。あなたは、サーバー側でグローバルクライアントサーバの状態を維持するために、必要がある、またはたい場合は、暗黙のうちに私たちはSOA指向[ウェブ]アプリとして記述することができるものを構築するが、ある種の[ウェブ]開発フレームワークのようなジャージを使用しています。誤ってあなたは、Webサービス(RESTまたはその他)の性質をねじるされています。あなたは、 は、それが最初の答えで提案されていた方法でそれを行うが、あなたはができなければならないの。最終的な結果は、Webサービス、Webサービスのツールで構成だけで、通常のアプリではありません。
-_ O
ありが可能です。ジャージー 文書 "と言ってい
セキュリティ情報の要請が可能に注入することによってJAX-RS SecurityContextインスタンスを使用@脈のアノテーションを期待での注入 セキュリティコンテキストインスタンスを同等の機能を ごHttpServletRequest APIに含まれています。に入射するセキュリティコンテキスト により、実際のジャージーの応用展開。例えば、 は、ジャージーの応用に展開されるServletコンテナのジャージー SecurityContextま獄からの情報セキュリティコンテキスト から取得されたリストアップされます。の場合はジャージーの応用 展開されるグリズリサーバのSecurityContext戻ります から取得された情報のグリズリーます。
例:
@Path("basket")
public ShoppingBasketResource get(@Context SecurityContext sc) {
if (sc.isUserInRole("PreferredCustomer") {
return new PreferredCustomerShoppingBasketResource();
} else {
return new ShoppingBasketResource();
}
}
または
@Path("resource")
@Singleton
public static class MyResource {
// Jersey will inject proxy of Security Context
@Context
SecurityContext securityContext;
@GET
public String getUserPrincipal() {
return securityContext.getUserPrincipal().getName();
}
}
または安全保障のボックスをチェックの注釈 このdocs.
ジャージもできるカスタマイズのSecurityContext:
のSecurityContextで直接検索 ContainerRequestContextよgetSecurityContext()メソッドがあります。こともでき 交換デフォルトのSecurityContextに要求コンテキストカスタム を使用setSecurityContext(SecurityContext。を設定した場合 カスタムSecurityContextインスタンスにおContainerRequestFilterこ セキュリティコンテキストインスタンスが入射JAX-RS resourceクラス。このように実践できるカスタム 認証フィルタが設定自分のSecurityContextする 使用します。確保のための早期実行のカスタム認証 請求フィルタ、フィルタの設定を優先認証を使用 定数から優先順位をもつ。の早期実行の認証 フィルタを実行するためその他のフィルター、資源、資源方法 サブリソースロケータを実行しとカスタム SecurityContextインスタンス.
見 事例の使い方を求ィジャージー.およびメンバーの件数をご確認ください以下の例:
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthRequestFilter implements ContainerRequestFilter {
@Context
HttpServletRequest webRequest;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
final HttpSession session = webRequest.getSession();
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return new PrincipalImpl((String)session.getAttribute("USER_NAME"));
}
@Override
public boolean isUserInRole(String s) {
return false;
}
@Override
public boolean isSecure() {
return false;
}
@Override
public String getAuthenticationScheme() {
return null;
}
});
}
}
警告! ここで紹介したジャージ2.4.Glassfish4.0.0に使古いジャージー2.0しま アップジャージーにはこれらのヒント (な実績のある仕事をすること。または、より良い方法はダウンロード 夜の構築のGlassfish4.0.1.のものを完全に安定したのが現状です。私の新しいバージョンだそうです。
更新: 現在(2014-02-14)Glassfish4.0.1nightly build用ジャージー2.5.1および文脈注射。
ジャックの対応にてセッションに通知するものとします。彼の特定のコンテナで実行できますが、サーブレットスペック以上で携帯性とJavaEE。
としてのセキュリティは、少なくとも、機会があらかじめごJAX-RS特定のコードの採用により、JaaS(Java認証-承認サービス) サーブレットフィルター.フィルタに使用できる施HTTP認証に成功auth、セットアップのJaaS対象に適切ですよね。おJAX-RS資源が確認できるため、適切な主体になれます。からだ全体の管理スタックすることが期待できる認証済みユーザー資源で試験す!), き実施の認可に基づき、現在の操作は、リソースのコードです。
私は、クライアントがAuthorizationヘッダを追加有し、このようなRESTのMethodeのでそれをテストすることによってこの問題を解決します:
@GET
@PRODUCES(MediaType.APPLICATION_JSON)
public String returnClients(@Context HTTPServletRequest request(
String auth = request.getHeader("Authorization");
Account acc = null;
if (auth!=null) {
Account acc = Utils.LoginAccount(auth);
}
if (acc == null)
// not logged in, handle it gracefully
この方法では、認証、セッションを開始せずにあります。
は、ジャージーのセキュリティのためには、ジャージーのOAuthサポートの表情を取る必要があります。あなたは、外部のユーザーにあなたのシステムのためのAPIを公開する際にはOAuthは完全に適合しています。例えばLinkedInのAPIのような
あなたは、グループへのユーザー@path単一の名前空間の下にサービスができます。 例。
@Path("/helloworld")
public class HelloWorld {
@GET
@Produces("text/plain")
public String hello() {
return "";
}
}
Instead of @Path("/helloworld") use
@Path("admin/helloworld") to expose you class as rest and bind filter on "admin/"
in web.xml as below.
<servlet>
<servlet-name>jersey-serlvet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>/</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jersey-serlvet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>myfilter</filter-name>
<filter-class>com.Filterclass</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/rest/admin/*</url-pattern>
</filter-mapping>
public class Filterclass implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
try{
chain.doFilter(request, response);
}catch(Exception e){
e.printStackTrace();
}
}
}
あなたは、このフィルタクラスであなたのセッションを検証することができます。