1

ジャージー実装を使用してJAX-RSを使用しています。Tomcat 6 を使用して BASIC 認証を使用してサービスを認証しようとしています。

これはコードです:

@Path("/authenticate")
@RolesAllowed({"Admin","Guest"})
public class BasicAuthenticationSecurity {

@GET
@Path("/wbiPing")
@Produces(MediaType.TEXT_PLAIN) 
@RolesAllowed("Admin")
public Response wbiPing(){

System.out.println("Pinged!!!");
return Response.ok("Pinged!!!").build();
}

}

を使用してメソッドに注釈を付けようとすると@RolesAllows、コンパイル エラーが発生します。

@RolesAllows cannot be resolved to a type

これを解決する方法を教えてください。これに必要な特定のjar/APIはありますか?

編集:

web.xml

<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>
            com.security;
            com.exception
        </param-value>
    </init-param>       
    <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>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey-serlvet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

<security-constraint>      
  <web-resource-collection>
      <web-resource-name>BasicDemo</web-resource-name>          
      <url-pattern>/*</url-pattern>
      <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
      <role-name>Admin</role-name>
  </auth-constraint>
</security-constraint>
  <login-config>
  <auth-method>BASIC</auth-method>
  <!-- The realm name is typically displayed by the browser in the login dialog box. -->
  <realm-name>Login</realm-name>      
  </login-config>

問題についてお知らせください。

4

5 に答える 5

11

このIBM 記事の1 行に目が覚めるまで、私は何時間も同様の問題に悩まされていました。驚くべきことに、この重要な事実に言及している書籍やユーザー ガイドは 1 つもありません。この重要な事実がなければ、認証は成功しません。

注釈ベースのセキュリティを使用する場合、web.xml はオプションではありません。それどころか、<security-constraint>要素が存在する必要があります。Web コンテナーは、JAX-RS が行う前にセキュリティーを検査します。また、 がないと<security-constraint>、適切なセキュリティー・コンテキストが設定されません。したがって、JAX-RS が を呼び出すisUserInRole(role)と、常に false が返されます。

さらに、<security-role>web.xml 内の要素または@DeclareRoles注釈のいずれかが存在する必要があります。

最後に、Jersey を使用する場合RolesAllowedDynamicFeatureは、アプリケーション クラスに登録して、アノテーション ベースのセキュリティを有効にする必要があります。

哀れなドキュメント、またはその欠如に苦労しているHTHその他の人は、そこにあります。

于 2013-11-16T23:54:08.027 に答える
5

コードにインポートがありますか?

import javax.annotation.security.RolesAllowed;

またannotations-api.jar、クラスパスにあることを確認してください。jarは、Tomcatインストールlibフォルダーにあります。

于 2013-03-05T23:56:55.783 に答える
4

最後にそれを機能させました!

Tomcat と Jersey で動作させる手順は次のとおりです。

TOMCAT_HOME/conf/tomcat-users.xml に次の内容があると仮定します。ここで、編集者とメンバーの 2 つのロールを定義します。

また、gavin、julie、および admin の 3 人のユーザーも定義します。

<?xml version="1.0" encoding="UTF-8"?>
  <role rolename="editor"/>
  <role rolename="member"/>

  <user username="admin" password="qwerty" roles="editor,member"/>
  <user username="gavin" password="qwerty" roles="editor"/>
  <user username="julie" password="qwerty" roles="member"/>
</tomcat-users>

ステップ 1. web.xml で Servlet 3.0 仕様を使用していることを確認する

セキュリティ アノテーションは、Servlet 2.5 以下では機能しません。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

</web-app>

ステップ 2. アプリケーション クラスを作成してセキュリティ アノテーションを有効にする

注: 以下のコードは、Jersey に固有のものです。

package ph.activelearning.rest.security;

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature;

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        super(TestResource.class);
        register(RolesAllowedDynamicFeature.class);
    }
}

ステップ 3. web.xml でアプリケーション クラスを指定する

ステップ 2 で作成した Application クラスが Jersey によって認識されることを確認します。

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>ph.activelearning.rest.security</param-value>
    </init-param>

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>ph.activelearning.rest.security.MyApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

ステップ 4. web.xml で security-constraint を作成する

皮肉なことに、セキュリティ アノテーションを使用したい場合でも、web.xml でセキュリティ制約を定義する必要があります。

以下の例では、/test/* へのアクセスを保護しようとしています。HTTP メソッドを指定しないことが重要です。(ex. <http-method>GET</http-method>) これは、すべての HTTP メソッドへのアクセスを拒否していることを意味します。

<auth-constraint>それでも、要素を介して、メソッドに関係なく、URL にアクセスできるすべてのロールを定義する必要があります。

<web-app …&gt;
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>test</web-resource-name>
            <url-pattern>/test/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>editor</role-name>
            <role-name>member</role-name>
        </auth-constraint>
    </security-constraint>
</web-app>

ステップ 5. web.xml で認証方法を指定する

次の例は、BASIC 認証を示しています。

<web-app …&gt;
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>test</realm-name>
    </login-config>
</web-app>

ステップ 6. セキュリティ ロールを定義する

セキュリティ ロールは、tomcat-users.xml で定義された同じロールに対応する必要があります。この例では、役割の編集者とメンバーを定義します。

注:認証/承認がなくても機能するため、この手順はオプションのようです。

<web-app ...>
    <security-role>
         <description>This is editor</description>
         <role-name>editor</role-name>
    </security-role>

     <security-role>
         <description>This is member</description>
         <role-name>member</role-name>
    </security-role>
</web-app>

ステップ 7. リソースに注釈を付ける

package ph.activelearning.rest.security;

import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.SecurityContext;

@Path("test")
@PermitAll
public class TestResource {

    @GET
    @Path("editor")
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed("editor")
    public String editorOnly() {
        return "Got to editor path!";
    }

    @GET
    @Path("member")
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed("member")
    public String memberOnly() {
        return "Got to member path!";
    }

    @GET 
    @Path("open")
    @Produces(MediaType.TEXT_PLAIN)
    public String open(@Context SecurityContext context) {
        return "Open to all! - " + context.getUserPrincipal().getName();
    }
}

それでおしまい。プログラミングを楽しむための完全な web.xml を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>ph.activelearning.rest.security</param-value>
        </init-param>

        <!-- Define the Application class where we enable security annotations -->
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>ph.activelearning.rest.security.MyApplication</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

    <!-- Required even though we use annotations -->
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>test</web-resource-name>
            <url-pattern>/test/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>editor</role-name>
            <role-name>member</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>test</realm-name>
    </login-config>

    <!-- Optional: Define security roles that are defined in your app server -->
    <!--  
    <security-role>
        <description>This is editor</description>
        <role-name>editor</role-name>
    </security-role>

    <security-role>
        <description>This is member</description>
        <role-name>member</role-name>
    </security-role>
    -->

</web-app>
于 2016-02-27T15:03:51.890 に答える
0

jsr250-api-1.0.jar を追加する必要があると思います。Maven を使用する場合は、これを追加できます。

    <dependency>
        <!-- Annotations for role management -->
        <groupId>javax.annotation</groupId>
        <artifactId>jsr250-api</artifactId>
        <version>1.0</version>
    </dependency>
于 2013-03-07T18:38:51.607 に答える
0

@Rolesallow を宣言する Java ライブラリを知りません。Java6 EE API ドキュメントでは、セキュリティで使用するアノテーションを 5 つだけ宣言しています。

@DeclareRoles
@DenyAll
@PermitAll
@RolesAllowed
@RunAs

クラスの役割をオーバーライドしようとしている場合は@RolesAllowed、メソッドを単純に入れることはできません。あなたがしたように、それはうまくいくと確信しています。

于 2013-03-04T00:28:31.980 に答える