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

请让我知道如何解决这个问题?为此需要任何特定的罐子/ 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 文章中的一行让我大开眼界之前,我为一个类似的问题苦苦挣扎了好几个小时。令人惊讶的是,没有一本书或用户指南提到这个关键事实,没有它,身份验证就无法成功。

当使用基于注解的安全性时,web.xml 不是可选的;恰恰相反,<security-constraint>元素必须存在;Web 容器在 JAX-RS 之前检查安全性,如果没有<security-constraint>,则未设置正确的安全上下文。因此,当 JAX-RS 调用 时isUserInRole(role),它总是返回 false。

此外,必须存在<security-role>web.xml 中的元素或注释。@DeclareRoles

最后,如果使用 Jersey,RolesAllowedDynamicFeature需要在 Application 类中注册以启用基于注释的安全性。

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。

<?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. 创建您的应用程序类以启用安全注释

注意:下面的代码特定于泽西岛。

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 中创建安全约束

具有讽刺意味的是,即使我们想使用安全注解,我们仍然需要在 web.xml 中定义一个安全约束。

在下面的示例中,我们尝试保护对 /test/* 的访问。不要指定任何 HTTP 方法,这一点很重要。(例如。<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

我不知道任何声明@RolesAllows 的java 库。Java6 EE API 文档仅声明了 5 个用于安全使用的注释。

@DeclareRoles
@DenyAll
@PermitAll
@RolesAllowed
@RunAs

如果您试图覆盖类角色,您不能@RolesAllowed像您所做的那样简单地放入您的方法,我相信这会起作用。

于 2013-03-04T00:28:31.980 回答
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 回答