我遵循澤西島教程爲我的應用程序實現完全自定義SecurityContext
。我創建了一個自定義的ContainerRequestFilter
設置SecurityContext
如下:JAX-RS自定義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/[email protected]")
.request().header("token", "token-for-admin").delete();
Assert.assertEquals(200, response.getStatus());
一切工作正常。
但是,如果我執行以下命令:
Response response = target("people/[email protected]").request().delete();
Assert.assertEquals(403, response.getStatus());
我希望一個403錯誤代碼,因爲我沒有設置身份驗證令牌。但是,我得到一個500錯誤代碼和一個Grizzly(用於測試的容器)HTML響應,字符串爲「請求失敗。」。
如果我註釋掉上SecurityRequestFilter
類@Provider
註釋或從測試配置中刪除包com.my.security
,澤西使用提供SecurityContext
容器和正確地返回403代替。
這是怎麼發生的?澤西不應該返回403自定義SecurityContext
嗎?我錯過了什麼?