在JAX-RS中使用API​​密钥进行身份验证

ccl*_*eve 6 java security rest web-services jax-rs

我们想用api密钥保护我们的休息api.以下是要求:

  1. 面向公众的服务需要api密钥.
  2. "私人"服务只能接受群集内的呼叫,而不是外部世界.
  3. 每个api标识一个用户,并且User对象必须可用于其余服务.

在JAX-RS应用程序中是否有一些标准方法可以执行此操作?(我们正在使用Resteasy.)

我已经阅读了有关过滤器,拦截器和基本身份验证的所有内容,但我不清楚什么是最好的方法.

在该应用程序的早期版本中,我们提供了一种自助式解决方案,其中公共服务在公共端口上运行,私有端口在私有端口上运行.有一个自定义api键查找,将User对象设置为其余服务对象的变量.

我无法弄清楚如何使用标准的JAX-RS来做这些事情.

cas*_*lin 11

使用过滤器拦截请求

这种身份验证可以通过ContainerRequestFilter拦截对资源方法的请求来实现.

过滤器将用于从请求中提取API密钥并对其进行验证.如果API密钥无效,则拒绝该请求.否则,请求将继续执行资源方法.

看看下面这段代码.所述ContainerRequestContextAPI可用于提取从HTTP请求信息:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        // Extract and validate the API key from the request
        String apiKey = requestContext.getHeaderString("API-Key");
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

另外看看我刚才写的关于JAX-RS中令牌认证的答案.在那里你会发现很多细节可以用来解决你在问题中描述的情况.

识别用户

在身份验证过程中,您必须能够识别正在执行请求的用户.要将此信息传播到资源类/方法,您可以:

  1. 覆盖SecurityContext并将其注入资源类/方法.
  2. 使用CDI Event和producer方法创建一个对象,该对象包含可以在资源类/方法中注入的用户标识符.

有关这些方法的更多详细信息,请参阅上面提到的答案.

将过滤器绑定到某些资源类/方法

默认情况下,过滤器是全局的(这意味着它们是针对应用程序的所有资源方法执行的).要将过滤器绑定到资源方法或类的子集,可以使用名称绑定注释.