加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:48:04 所属栏目:Java 来源:网络整理
导读:我正在使用WildFly 8在 JavaEE 7中开发一个新的应用程序.我正在使用JAX-RS为远程应用程序提供RESTful服务接口. 可以使用@Context注释在资源方法参数中注入类似HttpHeaders对象的东西.由于该对象基于请求参数(当然,HTTP标头),我提出了创建我自己的可注入User
我正在使用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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读