使用安全性配置Jersey测试框架

时间:2014-02-27 11:50:04

标签: security rest jersey jetty

我正在使用Jersey编写REST Web服务,我正在尝试使用Jersey测试框架编写一组单元测试来测试服务。

但是,我使用HTTP身份验证和SecurityContext作为我的Web服务的一部分,我在设置JTF时遇到问题,允许我测试这些方面。我可以在请求中发送身份验证信息,但如何配置它以了解我希望设置的不同角色和用户?

我目前正在使用Jetty(通过JettyTestContainerFactory),但如果需要,可以切换到不同的测试容器。

我想要实现的具体配置是两个角色,四个用户具有这些可能角色的组合(例如,无角色,角色a,角色b,角色a和b)。 Web服务将处理对不同URL的访问,因此不需要在配置中指定。

1 个答案:

答案 0 :(得分:1)

我通过实现类似于Jersey提供的Jetty Test容器来完成此操作。我们使用嵌入式Jetty来正常测试我们的开发应用程序,并通过创建我们自己的基于嵌入式Jetty的测试容器来加载我们的Web应用程序,就像它是由Java主进程启动一样。

我们使用在jetty-env.xml文件中配置的自定义Jetty安全处理程序,嵌入式Jetty用于配置安全性。

<Set name="securityHandler">
    <New class="com.example.DevelopmentSecurityHandler">
        <Set name="loginService">
            <New class="com.example.DevelopmentLoginService">
                <Set name="name">LocalRealm</Set>
                <Set name="config">src/main/webapp/WEB-INF/users.properties</Set>
                <Call name="start" />
            </New>
        </Set>
        <Set name="authenticator">
             <New class="com.example.DevelopmentAuthenticator"></New>
        </Set>
        <Set name="checkWelcomeFiles">true</Set>
    </New>
</Set>

Jetty env文件由嵌入式Jetty加载:

XmlConfiguration configuration = null;
if (jettyEnvFile.exists()) {
    try {
    configuration = new XmlConfiguration(jettyEnvFile.toURI().toURL());
    } catch (Exception e) {
        throw new ProcessingException(String.format("Exception loading jetty config from %s", jettyEnvFile));
    }
} else {
    LOG.warn("No jetty-env.xml found.");
}

该xml中引用的users.properties文件是角色映射的简单用户,例如     USERNAME = PASSWORD,ROLE_NAME1,ROLE_NAME2

根据您配置Jetty安全性的方式,这可能适用于您,也可能不适合您。您也可以通过编程方式对其进行配置,有很多嵌入式Jetty here的示例。 SecuredHelloHandler.java示例可能是一个很好的开始。

对于测试容器,您基本上可以从复制org.glassfish.jersey.test.jetty.JettyTestContainerFactoryorg.glassfish.jersey.jetty.JettyHttpContainerFactory开始,实质上更改

public static Server createServer(final URI uri, final SslContextFactory sslContextFactory, final JettyHttpContainer handler, final boolean start)

创建您的安装版本的嵌入式Jetty服务器的方法,但需要。