web-dev-qa-db-ja.com

Jerseyでのユーザー認証RESTサービス

Jerseyフレームワークを使用しているRESTアプリケーションを開発しています。ユーザー認証を制御する方法を知りたいと思います。多くの場所を検索しました。 : http://weblogs.Java.net/blog/2008/03/07/authentication-jersey

ただし、この記事はGlassFishサーバーと接続されたデータベースでのみ使用できます。とにかく、ジャージーにインターフェイスを実装し、要求されたRESTリソースに到達する前に、それをフィルターとして使用することができますか?

今すぐ基本認証を使用したいのですが、後で変更できるように十分な柔軟性が必要です。

39
Stefan

JerseyベースのAPIを保護するために、春のセキュリティをうまく使用しています。プラグイン可能な認証スキームを備えているため、基本認証から別の認証に切り替えることができます。私は一般的にSpringを使用しておらず、セキュリティ関連のものだけを使用しています。

ここに私のweb.xmlからの関連部分があります

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/security-applicationContext.xml,
        /WEB-INF/applicationContext.xml
    </param-value>
</context-param>

<!-- Enables Spring Security -->

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
        org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>springSecurityFilterChain</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>

</filter-mapping>

ApplicationContext.xmlを空のままにできます(<beans> </ beans>)。 security-applicationContext.xmlの例は here にあります。

32
Magnus Eklund

私はこれに似たものに取り組んでいます。私の実装では、HTTP基本認証を処理するためにフロントエンドのApache httpdがあり、ユーザーとロールを含むヘッダー情報を持つすべてのリクエストを単に転送します。

それから、 servlet filter を使用してこれらのピースを解析し、 CodeRanch で見つけた投稿を使用してHttpServletRequestをラップしています。これにより、フィルタリングする各リソースでjavax.annotation.securityなどの@RolesAllowed注釈を使用できます。ただし、これらすべてを機能させるには、サーブレットのweb.xmlで次を追加する必要がありました。

<servlet>
  <!-- some other settings and such 
  ... -->
  <init-param>
    <param-name>com.Sun.jersey.spi.container.ResourceFilters</param-name>
    <param-value>com.Sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value>
  </init-param>
  ...
</servlet>

最近の興味のある投稿に関するEric Warrinerの答えを見つけるかもしれません: Jersey、Tomcat and Security Annotations

8
Nick Klauer

ここを見てください、私はそれを試している途中ですが、それは有望に見えます:

http://anismiles.wordpress.com/2012/03/02/securing-versioning-and-auditing-rest-jax-rs-jersey-apis/

この例は、JASPI/JASPICを実装しようとするよりもはるかに単純であり、個々のメソッド(@ RolesAllowed、@ PermitAll、@ DenyAllなど)の粒度が向上しています。

(これは古いスレッドですが、潜在的に有用な情報を追加するだけです)

4
millebi

もちろん、これには従来のサーブレットフィルターを使用できます。

Web.xmlにフィルターを追加し、使用している認証ヘッダー(BasicまたはDigest)を確認し、それらの値に基づいて認証ロジックを実行し、結果をセッション属性に保存します。 Jerseyリソース(おそらくctor)で、セッション属性から認証結果を抽出し、これが必要な結果であるかどうかに基づいて処理を続行するかどうかを決定します。

ジャージーリソースアクターはおそらく次のようになります。

protected AbstractResource(@Context ServletContext servletContext, 
    @Context HttpServletRequest httpServletRequest) {

    ...

    HttpSession session = httpServletRequest.getSession();
    // get whatever you put in the session in the auth filter here and compare
}
3
ae6rt

単純なサーブレットフィルターを記述するか、ResourceFilterFactoryを実装し、ContainerRequestFilterで認証を処理する必要があります。詳細なコードはリンクにあります http://neopatel.blogspot.com/2011/11/jesey-writing-authentication-filter.html 。私は、完全にライフサイクルを制御できるサーブレットフィルターアプローチが個人的に好きです。ただし、QueryParamsやPathParamsへのアクセスなど、より具体的なものが必要な場合は、ResourceFilterFactoryが最適です。

2
kalpesh