Dropwizard管理员servlet的安全性(版本1.1.1)

时间:2018-02-10 09:26:14

标签: java dropwizard

我正在使用Dropwizard (1.1.1)

我的安全上下文定义如下:

    environment.jersey().register(new AuthDynamicFeature(new BasicCredentialAuthFilter.Builder<User>()
            .setAuthenticator(new BasicAuthenticator())
            .setAuthorizer(new BasicAuthorizer())
            .setRealm("SECURITY REALM")
            .buildAuthFilter()));

    environment.jersey().register(new AuthValueFactoryProvider.Binder<>(User.class));
    environment.jersey().register(RolesAllowedDynamicFeature.class);

最近我将管理页面移动到我的网络应用程序中。代码就在这里:

    environment.getApplicationContext().setAttribute(
            MetricsServlet.METRICS_REGISTRY,
            environment.metrics());
    environment.getApplicationContext().setAttribute(
            HealthCheckServlet.HEALTH_CHECK_REGISTRY,
            environment.healthChecks());
    environment.getApplicationContext().addServlet(
            new NonblockingServletHolder(new AdminServlet()), "/admin/*");

如何向Dropwizard admin servlet添加安全上下文?

我已经查看了这个StackOverflow answer,但似乎没有任何效果。看起来该答案中的所有内容都已弃用。

1 个答案:

答案 0 :(得分:1)

好吧,admin servlet是一个普通的旧servlet,而不是Jersey资源。鉴于您正在创建一个新的管理servlet(您是否禁用了默认的管理上下文?),您只需将servlet过滤器注册到应用程序上下文,如下所示:

environment.getApplicationContext().addFilter(new FilterHolder(new AdminServletFilter()), "/admin/*", EnumSet.of(DispatcherType.REQUEST));

您的AdminServletFilter可以按照您喜欢的方式对用户进行身份验证,例如,如果您要进行基本身份验证,请使用此implementation

也就是说,如果您的目的是将管理servlet移动到与应用程序连接器相同的端口上运行,更好的方法是通过config:

server:
  type: simple
  adminContextPath: /admin
  applicationContextPath: /
  connector:
    type: http
    port: 8080

此外,我已将您链接到的问题更新为适用于最新Dropwizard版本here的安全处理程序实现。有了这个,您可以通过注册安全处理程序来保护管理servlet:

environment.admin().setSecurityHandler(new AdminConstraintSecurityHandler("admin", "supersecret"));