【问题标题】:Access HttpServletRequest from an Authenticator using Dropwizard使用 Dropwizard 从 Authenticator 访问 HttpServletRequest
【发布时间】:2016-06-27 10:32:30
【问题描述】:

使用 DropWizard(Jersey Server),是否可以从 Authenticator 访问HttpServletRequest

我会给它一个属性。

我试过了:

@Context
private HttpServletRequest servletRequest;

但它没有注入。

我使用以下方式注册了我的身份验证器:

env.jersey().register(
                new AuthDynamicFeature(new BasicCredentialAuthFilter.Builder<User>().setAuthenticator(new FooAuthentificator())
                        .setRealm("Realm").buildAuthFilter()));

【问题讨论】:

    标签: dependency-injection jersey dropwizard


    【解决方案1】:

    这是可能的,但问题是,Authenticator 从未经历过 DI 生命周期,因此它永远没有机会被注入。我们可以做的是我们自己显式地注入它。为此,我们需要获取ServiceLocator(这是主要的 IoC 容器,有点像 Spring 中的 ApplicationContext)。一旦我们有了ServiceLocator,我们就可以调用locator.inject(anyObject) 来显式地解决任何注入依赖。

    在配置应用程序时,获取ServiceLocator 的最简单位置是Feature。这里我们也可以注册 Jersey 组件。在FeatureContext(见下文)上调用register 就像使用Dropwizard 调用env.jersey().register(...),具有相同的效果。所以我们可以做

    public class AuthenticatorFeature implements Feature {
    
        @Override
        public boolean configure(FeatureContext ctx) {
            ServiceLocator locator = ServiceLocatorProvider.getServiceLocator(ctx);
            TestAuthenticator authenticator = new TestAuthenticator();
            locator.inject(authenticator);
            ctx.register(new AuthDynamicFeature(new BasicCredentialAuthFilter.Builder<User>()
                            .setAuthenticator(authenticator)
                            .setRealm("SEC REALM")
                            .buildAuthFilter()));
            ctx.register(new AuthValueFactoryProvider.Binder<>(User.class));
            return true;
        }
    }
    

    您可以看到通过调用locator.inject(authenticator) 显式注入身份验证器。然后我们通过 Dropwizard 注册这个特性

    env.jersey().register(new AuthenticatorFeature());
    

    经过测试,工作正常。


    注意,如果您想知道如何注入HttpServletRequest,当没有当前请求时,这是因为注入了代理。就像您将请求注入 Jersey 过滤器一样,同样的事情也会发生;注入了代理,因为只有一个单例过滤器,但是请求随着请求的变化而变化,所以需要注入代理。

    另请参阅:

    【讨论】:

      猜你喜欢
      • 2012-01-21
      • 2013-07-29
      • 2012-12-15
      • 2016-03-19
      • 2010-11-01
      • 1970-01-01
      • 2017-12-01
      • 2016-06-26
      相关资源
      最近更新 更多