2014-02-06 48 views
1

我遵循澤西島教程爲我的應用程序實現完全自定義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嗎?我錯過了什麼?

回答

1

我爲我的啞巴道歉。 isUserInRole方法中的邏輯完全相關!我有一個NPE在那裏,我沒有看到並導致500.

相關問題