gpt4 book ai didi

java - JAX-RS 自定义 SecurityContext 导致 Jersey 错误代码

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:09:28 26 4
gpt4 key购买 nike

我按照 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 错误代码,因为我没有设置身份验证 token 。但是,我收到一个 500 错误代码和一个带有字符串“请求失败”的 Grizzly(用于测试的容器)HTML 响应。

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

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

最佳答案

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

关于java - JAX-RS 自定义 SecurityContext 导致 Jersey 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com