在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;
}
}
我想在 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;
}
}