OSGI JAX-RS 名称绑定
OSGI JAX-RS name binding
目前我正在使用干净的 kura-osgi 项目。我的目标是实现 JWT 身份验证或类似的东西,只是为了提供安全的端点。我尝试过使用名称绑定的身份验证过滤器。然而看起来,在某种程度上名称绑定没有被注册。在这种情况下,我测试了简单的 maven 项目,发现那里一切正常。有代码:
TestAuth.class
@Path("/test")
public class TestAuth extends Application {
@GET
@Secured
@Produces(MediaType.TEXT_PLAIN)
public String test() {
return "hello";
}
}
名称绑定接口:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Secured {}
过滤器:
@Provider
@PreMatching
@Secured
public class AuthenticationFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
System.out.println("GG");
}
}
我已经检查了很多方法来修复它,例如:但是这个似乎也不起作用。
经过很多不同的解决方法,我找到了简单的解决方案。只需注册为组件即可修复问题。过滤器 class 将如下所示:
@Provider
@Component(service = ContainerRequestFilter.class)
@Secured
public class AuthenticationFilter implements ContainerRequestFilter, ContainerResponseFilter {
private static final Logger LOG = LoggerFactory.getLogger(AuthenticationFilter.class);
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
LOG.info("Request filter called");
}
public void filter(ContainerRequestContext containerRequestContext,
ContainerResponseContext containerResponseContext) throws IOException {
LOG.info("Response filter called");
}
}
这有点晚了,但我又被这个问题绊倒了......
这里的问题实际上是 @PreMatching
注释,它实际上与 @NameBinding
注释冲突。
因此,如果您想使用 @RolesXXX
注释,您必须将过滤器定义为 @PreMatching
失去 NameBinding
功能。
目前我正在使用干净的 kura-osgi 项目。我的目标是实现 JWT 身份验证或类似的东西,只是为了提供安全的端点。我尝试过使用名称绑定的身份验证过滤器。然而看起来,在某种程度上名称绑定没有被注册。在这种情况下,我测试了简单的 maven 项目,发现那里一切正常。有代码:
TestAuth.class
@Path("/test")
public class TestAuth extends Application {
@GET
@Secured
@Produces(MediaType.TEXT_PLAIN)
public String test() {
return "hello";
}
}
名称绑定接口:
@NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface Secured {}
过滤器:
@Provider
@PreMatching
@Secured
public class AuthenticationFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
System.out.println("GG");
}
}
我已经检查了很多方法来修复它,例如:
经过很多不同的解决方法,我找到了简单的解决方案。只需注册为组件即可修复问题。过滤器 class 将如下所示:
@Provider
@Component(service = ContainerRequestFilter.class)
@Secured
public class AuthenticationFilter implements ContainerRequestFilter, ContainerResponseFilter {
private static final Logger LOG = LoggerFactory.getLogger(AuthenticationFilter.class);
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
LOG.info("Request filter called");
}
public void filter(ContainerRequestContext containerRequestContext,
ContainerResponseContext containerResponseContext) throws IOException {
LOG.info("Response filter called");
}
}
这有点晚了,但我又被这个问题绊倒了......
这里的问题实际上是 @PreMatching
注释,它实际上与 @NameBinding
注释冲突。
因此,如果您想使用 @RolesXXX
注释,您必须将过滤器定义为 @PreMatching
失去 NameBinding
功能。