@RolesAllowed无法用泽西解决

我正在使用JAX-RS使用平针织实现。 我正在尝试使用Tomcat 6使用BASIC身份validation来validation我的服务。

这是代码:

@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中

  jersey-serlvet com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages  com.security; com.exception    com.sun.jersey.spi.container.ResourceFilters com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory  1   jersey-serlvet /*    BasicDemo /* GET   Admin    BASIC  Login  

请让我知道这个问题。

几个小时之前,我一直在努力解决类似的问题,然而这篇 IBM文章中的一行开启了我的视线。 令人惊讶的是,没有一本书或用户指南提到这个关键事实,没有它,认证就无法成功。

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

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

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

HTH其他人在那里挣扎着可怜的文件或缺乏文件。

你的代码中有导入吗?

 import javax.annotation.security.RolesAllowed; 

还要确保annotations-api.jar在您的类路径中。 jar可以在Tomcat安装lib文件夹中找到。

终于成功了!

以下是使其在Tomcat和Jersey中运行的步骤。

假设我们在TOMCAT_HOME / conf / tomcat-users.xml中有以下内容,我们在其中定义了2个角色 – 编辑器和成员。

我们还定义了三个用户 – gavin,julie和admin。

        

步骤1.确保在web.xml中使用Servlet 3.0规范

安全注释不适用于Servlet 2.5及更低版本。

    

步骤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中指定您的应用程序类

确保Jersey中识别您在步骤2中创建的Application类。

  Jersey Web Application org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages ph.activelearning.rest.security   javax.ws.rs.Application ph.activelearning.rest.security.MyApplication  1  

步骤4.在web.xml中创建安全性约束

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

在下面的示例中,我们尝试保护对/ test / *的访问。 您不指定任何HTTP方法很重要。 (例如, GET )这意味着您拒绝访问所有HTTP方法。

但是,您需要通过元素定义可以访问URL的所有角色,而不管方法如何。

    test /test/*   editor member    

步骤5.在web.xml中指定身份validation方法

以下示例说明了BASIC身份validation。

   BASIC test   

步骤6.定义安全角色

安全角色应该与tomcat-users.xml中定义的相同角色相对应。 在此示例中,我们定义角色编辑器和成员。

注意:似乎此步骤是可选的,因为即使没有它,身份validation/授权仍然有效。

   This is editor editor   This is member member   

步骤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。

    Jersey Web Application org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages ph.activelearning.rest.security    javax.ws.rs.Application ph.activelearning.rest.security.MyApplication  1   Jersey Web Application /*     test /test/*   editor member    BASIC test     

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

 @DeclareRoles @DenyAll @PermitAll @RolesAllowed @RunAs 

如果你试图覆盖类角色,你不能简单地将@RolesAllowed放在你的方法中,就像你一样,我相信它会起作用。

我想你应该添加jsr250-api-1.0.jar。 如果你使用Maven,你可以添加:

    javax.annotation jsr250-api 1.0