Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAX-RS自定义SecurityContext在Jersey中导致错误错误代码_Java_Http_Rest_Jersey_Http Status Code 403 - Fatal编程技术网

Java JAX-RS自定义SecurityContext在Jersey中导致错误错误代码

Java JAX-RS自定义SecurityContext在Jersey中导致错误错误代码,java,http,rest,jersey,http-status-code-403,Java,Http,Rest,Jersey,Http Status Code 403,我按照Jersey教程为我的应用程序实现了一个完全定制的SecurityContext。我创建了一个自定义的ContainerRequestFilter来设置SecurityContext,如下所示: package com.my.security; @Provider @Priority(Priorities.AUTHORIZATION) public class SecurityRequestFilter implements ContainerRequestFilter { @Over

我按照Jersey教程为我的应用程序实现了一个完全定制的
SecurityContext
。我创建了一个自定义的
ContainerRequestFilter
来设置
SecurityContext
,如下所示:

package com.my.security;
@Provider
@Priority(Priorities.AUTHORIZATION)
public class SecurityRequestFilter implements ContainerRequestFilter {
  @Override
  public void filter(ContainerRequestContext requestContext) {
    requestContext.setSecurityContext(new MySecurityContext(requestContext));
  }
  public static final class MySecurityContext implements SecurityContext {
    private String token;
    public MySecurityContext(ContainerRequestContext requestContext) {
      token = requestContext.getHeaderString("token");
    }
    @Override
    public boolean isUserInRole(String role) {
      return role.equals("admin") && token.equals("token-for-admin");
    }
    // other methods omitted
  }
}
isUserInRole
方法中的逻辑是不相关的,它只是一个用来说明问题的模拟

我的端点看起来像:

package com.my.rest;
@PermitAll
@Path("/people")
public class PeopleRestService {
  @RolesAllowed({"admin"})
  @Path("/{email}")
  @DELETE
  public Response deletePerson(@PathParam("email") final String email) {
    peopleService.removePerson(email);
    return Response.ok().build();
  }
}
现在,我创建了一个测试(使用
JerseyTest
),该测试配置了两个类所在的包:

@Override
protected Application configure() {
  return new ResourceConfig().packages("com.my.rest", "com.my.security");
}
如果我在测试中执行以下操作:

Response response = target("people/my@email.com")
  .request().header("token", "token-for-admin").delete();
Assert.assertEquals(200, response.getStatus());
一切正常

但是,如果我执行以下操作:

Response response = target("people/my@email.com").request().delete();
Assert.assertEquals(403, response.getStatus());
我希望出现403错误代码,因为我没有设置身份验证令牌。但是,我得到一个500错误代码和一个Grizzly(用于测试的容器)HTML响应,字符串为“Request failed”

如果我在
SecurityRequestFilter
类上注释掉
@Provider
注释,或者从测试配置中删除包
com.my.security
,Jersey将使用提供的容器
SecurityContext
,并正确返回403


为什么会这样?Jersey不也应该返回带有自定义
SecurityContext
的403吗?我错过了什么?

我为自己的愚蠢道歉。
isUserInRole
方法中的逻辑是完全相关的!我有一个NPE在那里,我没有看到,是造成500