【问题标题】:JAX-RS custom SecurityContext leads to wrong error code in JerseyJAX-RS 自定义 SecurityContext 导致 Jersey 错误代码
【发布时间】:2014-02-06 20:40:36
【问题描述】:

我按照 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 错误代码和一个带有字符串“Request failed.”的 Grizzly(用于测试的容器)HTML 响应。

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

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

【问题讨论】:

    标签: java http rest jersey http-status-code-403


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2013-02-17
      相关资源
      最近更新 更多