繁体   English   中英

如何使用自定义Dropwizard筛选器有选择地保护资源

[英]How to Optionally Protect a Resource with Custom Dropwizard Filter

我正在使用Dropwizard 0.9.2,我想创建一个资源,该资源不需要GET身份验证,而需要POST基本身份验证。

我试过了

@Path("/protectedPing")
@Produces(MediaType.TEXT_PLAIN)
public class ProtectedPing {

@GET
public String everybody() {

    return "pingpong";
}

@PermitAll
@POST
public String authenticated(){
    return "secret pingpong";
}

CachingAuthenticator<BasicCredentials, User> ca = new CachingAuthenticator<>(environment.metrics(), ldapAuthenticator, cbSpec);
AdminAuthorizer authorizer = new AdminAuthorizer();
BasicCredentialAuthFilter<User> bcaf = new BasicCredentialAuthFilter.Builder<User>().setAuthenticator(ca).setRealm("test-oauth").setAuthorizer(authorizer).buildAuthFilter();
environment.jersey().register(bcaf);
environment.jersey().register(RolesAllowedDynamicFeature.class);
environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class));
environment.jersey().register(new ProtectedPing());

这似乎导致对“ / protectedPing”的所有请求都需要基本身份验证。

在Dropwizard 0.9.2中,文档说如果我有一个受保护的资源,则创建一个自定义过滤器。 我以为我需要这样做,但是我不知道从哪里开始,或者我是否真的需要做些什么。

这更多的是球衣问题,而不是dropwizard问题。 您可以在这里查看: https : //jersey.java.net/documentation/latest/filters-and-interceptors.html

本质上您想要的是:

  1. 创建一个注释,指示您要测试身份验证(例如@AuthenticatePost)

  2. 创建资源并使用@AuthenticatePost注释正确的方法

  3. 创建您的身份验证筛选器(可能类似于您在上面所做的操作)。

  4. 在动态功能中,测试注释是否存在于传入的资源中。 对于发布,这将成立,对于获取,将成立。 然后,直接在资源方法上而不是在资源上全局注册AuthenticationFilter。

这将是我如何解决此问题的半完整示例:

public class MyDynamicFeature implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        if(resourceInfo.getResourceMethod().getAnnotation(AuthenticateMe.class) != null ) {
            context.register(MyAuthFilter.class);
        }
    }

    public class MyAuthFilter implements ContainerRequestFilter {

        @Override
        public void filter(ContainerRequestContext requestContext) throws IOException {
            // do authentication here
        }

    }

    public @interface AuthenticateMe {

    }

    @Path("myPath")
    public class MyResource {

        @GET
        public String get() {
            return "get-method";
        }

        @POST
        @AuthenticateMe
        public String post() {
            return "post-method";
        }
    }
}

请注意,在向功能上下文注册身份验证之前,DynamicFeature会检查是否存在身份验证注释。

希望对您有所帮助,

如果您有任何问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM