3

我对 Jersey 和 JAX-RS 比较陌生,但是我在文档中找不到关于在 Resource 的构造函数中使用 SecurityContext 的方法。

我们的 OAUTH 实现目前是这样的,即 REST API 上的所有请求都被 ResourceFilter 的实现拦截。所以资源过滤器通过调用来设置用户主体:

containerRequest.setSecurityContext(new MySecurityContext(user));

... 在 ContainerRequest.filter() 方法中,wWith 一个具体的类 MySecurityContext,如:

public class MySecurityContext implements SecurityContext {

    private final User principal;

    public MySecurityContext(final User user) {
        this.principal = user;
    }

    @Override
    public String getAuthenticationScheme() {
        return SecurityContext.FORM_AUTH;
    }

    @Override
    public Principal getUserPrincipal() {
        return principal;
    }

    @Override
    public boolean isSecure() {
        return false;

    }

    @Override
    public boolean isUserInRole(String role) {
        return principal.getRoles().contains(role);
    }
}

现在我想在调用任何 @GET/@POST/@DELETE 方法之前在 webresource 的构造函数中使用该用户主体。我试过注射

@Context SecurityContext

..进入构造函数参数列表,但调用 getUserPrincipal() 只会产生 null。

有没有办法在 Webresource 的构造函数中检查 Principal 用户?

谢谢!

4

1 回答 1

1

如果我将它注入我的 API 端点,它对我有用:

@POST
@ResourceFilters({MyAuthenticationFilter.class})
public Response foo(@Context HttpServletRequest request, @Context SecurityContext security) {
    final Principal principal = security.getUserPrincipal();
    [...]
    return Response.status(Response.Status.OK).build();
}
于 2015-07-09T09:41:49.653 回答