在dropwizard中授权

Authorization in dropwizard

我想在 0.8.0-rc3-SNAPSHOT 中使用 dropwizard 制作一个小应用程序。因为我想如果任何用户会打电话给我 api 用户应该在 header part.What 中传递一个 authtoken 我到目前为止所做的是 ---

@Override
public void run(HelloWorldConfigurationhelloWorldConfiguration,Environment environment) throws Exception{
environment.jersey().register(new ViewResource());      
environment.servlets().addFilter("MyCustomRequestFilter", new MyCustomRequestFilter())
            .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),false, "/*");
}

public class MyCustomRequestFilter implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest request) {
    System.out.print("test");
    if ( request.getQueryParameters().containsKey("validateMeParam") ) {
              /* validation logic */
    }
    // finished validation
    return request;
}
}

我不知道我在做什么wrong.It没用。

ContainerRequestFilter 不是 Servlet Filter,这是您通过 environment.servlets().addFilter 所做的假设。这应该添加到 Jersey 配置中。

environment.jersey().register(MyCustomRequestFilter.class);

并且不要忘记过滤器上的 @Provider 注释 class。

  • 在 Dropwizard 文档的 Jersey Filters 中查看有关过滤器的更多信息。

更新

我看到另一个严重的问题。你说你正在使用 Dropwizard 0.8.0,它使用 Jersey 2。在这种情况下,你发布的 ContainerRequestFilter 甚至不应该存在。在 Jersey 1 中,filter 方法的参数是 ContainerRequest,而在 Jersey 2 中,参数是 ContainerRequestContext。请显示依赖项,并验证上面的 class 是实际的 class

希望您正在寻找此类样品

https://github.com/stevenalexander/dropwizard-security

/* 一个示例安全提供程序,它将在端点使用 auth 属性接收到每个请求时查看每个请求 */

public class ExampleSecurityProvider<T> implements InjectableProvider<Auth, Parameter> {

public final static String CUSTOM_HEADER = "custom-security-token";

private final Authenticator<ExampleCredentials, T> authenticator;

public ExampleSecurityProvider(Authenticator<ExampleCredentials, T> authenticator) {
    this.authenticator = authenticator;
}

private static class ExampleSecurityInjectable<T> extends AbstractHttpContextInjectable<T> {

    private final Authenticator<ExampleCredentials, T> authenticator;
    private final boolean required;

    private ExampleSecurityInjectable(Authenticator<ExampleCredentials, T> authenticator, boolean required) {
        this.authenticator = authenticator;
        this.required = required;
    }

    @Override
    public T getValue(HttpContext c) {
        // This is where the credentials are extracted from the request
        final String header = c.getRequest().getHeaderValue(CUSTOM_HEADER);

        try {
            if (header != null) {
                final Optional<T> result = authenticator.authenticate(new ExampleCredentials(header));
                if (result.isPresent()) {
                    return result.get();
                }
            }
        } catch (AuthenticationException e) {
            throw new WebApplicationException(Response.Status.UNAUTHORIZED);
        }

        if (required) {
            throw new WebApplicationException(Response.Status.UNAUTHORIZED);
        }

        return null;
    }
}