我正在从DropWizard 0.7.1迁移到0.8.1.这包括从Jersey 1.x迁移到2.x. 在我使用Jersey 1.18.1的实现中,我实现了MyProvider(为简单起见改变了所有类名)InjectableProvider.该类将创建MyInjectable包含自定义注入注释的对象MyToken.MyToken包含传递和读取的各种属性MyInjectable.最后,在Application类中我注册了一个新的实例MyProvider,如下所示.
我做了一些研究,似乎无法解决我在泽西岛2.x中如何重新创建(或替代,我认为)这样一个场景.
这是当前的1.18.1实现:
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.PARAMETER, ElementType.FIELD })
public @interface MyToken {
// Custom annotation containing various attributes
boolean someAttribute() default true;
// ...
}
public class MyProvider implements InjectableProvider<MyToken, Parameter> {
// io.dropwizard.auth.Authenticator
private final Authenticator<String, MyObject> authenticator;
public MyProvider(Authenticator<String, MyObject> authenticator) {
this.authenticator = authenticator;
}
@Override
public ComponentScope getScope() {
return ComponentScope.PerRequest;
}
@Override
public Injectable<?> getInjectable(ComponentContext …Run Code Online (Sandbox Code Playgroud) 在尝试使用OSGi中的单例资源嵌入RESTEasy时(使用与resteasy-osgi-bundle类似的东西),令我惊讶的是,现场注入@Context UriInfo可用并且在每个请求上都有效.
进一步挖掘我发现代理魔术和ThreadLocal在ResteasyProviderFactory.一切都很好,但我无法在docs中找到任何对这种行为的引用,既不是在RESTEasy中也不是在JAX-RS规范中.
在Jersey文档中,我们可以找到类似的内容:
特定请求对象存在例外,它甚至可以注入构造函数或类字段[ 具有单例范围的资源 - OP].对于这些对象,运行时将注入能够同时服务更多请求的代理.这些请求的对象是
HttpHeaders,Request,UriInfo,SecurityContext.可以使用@Context注释注入这些代理.
它在RESTEasy中看起来如何?目前的实施是稳定还是实验?可以注入单例的特定于请求的类的集合是什么?
我已经实现了一个ContainerRequestFilter执行基于JWT的身份验证:
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
AuthenticationResult authResult = ...
if (authResult.isSuccessful()) {
// Client successfully authenticated.
// Now update the security context to be the augmented security context that contains information read from the JWT.
requestContext.setSecurityContext(new JwtSecurityContect(...));
} else {
// Client provided no or an invalid authentication token.
// Deny request by sending a 401 response.
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
}
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我更新了SecurityContext请求,JwtSecurityContext如果身份验证成功,则将其设置为我自己的自定义实现()的实例.此实现添加了额外的身份验证和授权数据,我希望稍后在后续过滤器和我的资源方法中访问这些数据. …