gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:50:28 32 4
gpt4 key购买 nike

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

类似于 HttpHeaders可以使用 @Context 将对象注入(inject)到资源方法参数中。注解。由于该对象基于请求参数(当然是 HTTP header ),所以我想出了创建自己的可注入(inject) User 的想法。基于请求中存在的有效 token (类似于 OAuth 访问 token )创建的对象。

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

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

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

}

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

现在,我的问题是:
  • 这是一个好的设计吗?如果没有,我有什么更好的选择?
  • 我怎样才能做到这一点?我不在乎我的解决方案是否不是 JAX-RS 特定的并且使用 WildFly/RestEasy 特定的内部结构,但如果存在可移植解决方案,我绝对更喜欢可移植解决方案。

  • 谢谢

    最佳答案

    在我看来,只要您不尝试使用此用户对象构建类似 session 的东西,这种方法就有效。

    answered here你可以使用 @Context@Provider但这并不是你想要的。
    根据 @Context 直接注入(inject)一个类可以使用 Resteasy Dispatcher .
    但是在这里你必须注册应该注入(inject)的对象。我认为这对于请求范围的参数没有意义。
    你可以做的是注入(inject)这样的提供者:

    // 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 .然后,您可以从注入(inject)的 HttpServletRequest 访问 UserPrincipal。
  • 实现一个 JAX-RS 拦截器,它实现了 ContainerRequestFilter .使用ContainerRequestContext.html#setSecurityContext使用 UserPrincipal 并将 SecurityContext 作为 ResourceMethod-Parameter 注入(inject)。
  • 实现 CDI-Interceptor它会更新您的方法参数。
  • 实现一个类which produces您的用户并通过 CDI 注入(inject)它。

  • 我将示例推送到 github .

    关于rest - 使用拦截器和注入(inject)在 JAX-RS 中进行身份验证/授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23035316/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com