ccl*_*eve 6 java security rest web-services jax-rs
我们想用api密钥保护我们的休息api.以下是要求:
在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中令牌认证的答案.在那里你会发现很多细节可以用来解决你在问题中描述的情况.
在身份验证过程中,您必须能够识别正在执行请求的用户.要将此信息传播到资源类/方法,您可以:
SecurityContext并将其注入资源类/方法.Event和producer方法创建一个对象,该对象包含可以在资源类/方法中注入的用户标识符.有关这些方法的更多详细信息,请参阅上面提到的答案.
默认情况下,过滤器是全局的(这意味着它们是针对应用程序的所有资源方法执行的).要将过滤器绑定到资源方法或类的子集,可以使用名称绑定注释.