rest – 使用拦截器和注入在JAX-RS中进行身份验证/授权

我正在使用WildFly 8在 JavaEE 7中开发一个新的应用程序.我正在使用JAX-RS为远程应用程序提供RESTful服务接口.

可以使用@Context注释在资源方法参数中注入类似HttpHeaders对象的东西.由于该对象基于请求参数(当然,HTTP标头),我提出了创建我自己的可注入User对象的想法,该对象是根据请求中存在的有效令牌创建的(类似于OAuth访问)令牌).

所以,我希望实现这样的目标:

@Path("/resources")
public class MyResource {

    @Path("/{id}")
    @GET
    public Response getById(@Context User user,@PathParam("id") long id) {
        ...
    }

}

其中User是基于请求参数创建的可注入对象,例如可通过HttpHeaders对象访问的对象.当然,如果由于任何原因无法创建User对象,则提供程序也可以抛出异常并返回HTTP错误响应.

现在,我的问题是:

>这是一个很好的设计吗?如果没有,我有哪些更好的选择?
>我怎样才能做到这一点?我不在乎我的解决方案是否特定于JAX-RS并且使用WildFly / RestEasy特定的内部,但我绝对更喜欢便携式解决方案(如果存在).

谢谢

解决方法

在我看来,只要您不尝试使用此用户对象构建类似会话的内容,此方法就是有效的.

作为answered here你可以使用@Context@Provider,但这不完全是你想要的.
使用Resteasy Dispatcher可以直接为每个@Context注入一个类.
但是在这里你必须注册应该注入的Object.我认为这对请求范围的参数没有意义.
您可以做的是注入这样的提供者:

// Constructor of your JAX-RS Application
public RestApplication(@Context Dispatcher dispatcher) {
    dispatcher.getDefaultContextObjects().put(UserProvider.class,new UserProvider());
}

// a resource
public Response getById(@Context UserProvider userProvider) {
    User user = userProvider.get();
}

解决问题的其他方法:

>注册WebFilter,验证用户,包装ServletRequest并覆盖getUserPrincipal.然后,您可以从注入的HttpServletRequest访问UserPrincipal.
>实现一个实现ContainerRequestFilter的JAX-RS拦截器.将ContainerRequestContext.html#setSecurityContext与UserPrincipal一起使用,并将SecurityContext注入ResourceMethod-Parameter.
>实现更新Method-Parameters的CDI-Interceptor.
>为您的用户实现一个类which produces并通过CDI注入它.

我把例子推到了github.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...