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

前端之家收集整理的这篇文章主要介绍了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相关文章