Tomee嵌入式适配器+ Arquillian + Jax-RS - 测试Jaas

时间:2015-07-30 10:51:01

标签: java jax-rs integration-testing jaas jboss-arquillian

我目前在测试使用@RolesAllowed保护的Restful方法/路径时遇到问题,当用户通过自定义JAAS LoginModule登录时,这些角色将从数据库中提取(我能够测试这些休息方法/不需要任何角色的路径。)

我已经在这里放了几天了,并且到处寻找(特别是在这里)以获得能够引导我到现在我所处的地方的答案,我将在前面描述。

我相信如果我将自定义LoginModule运行在TomEE嵌入式适配器(目前不是)上,我将能够登录用户。

我的问题如下:

如何在TomEE嵌入式适配器中设置选项-Djava.security.auth.login.config=path/to/login.config",以便将自定义LoginModule用作JAASRealm?

我做了以下事情:

  1. 已添加到Arquillian.xml(由于某种原因,我们省略了<property>个标签。)

    <property name="catalina_opts">
     Djava.security.auth.login.config=$CATALINA_HOME/conf/jaas.config" 
    </property>
    
  2. 添加到surefire插件中的pom.xml :(由于某种原因,我们省略了<argline>个标签。)

    <argLine>
        -Djava.security.auth.login.config=${project.basedir}/target/test-classes/conf/test-login.config"
    </argLine>
    
  3. 在test-server.xml中添加了领域,并在arquillian.xml中添加了属性

  4. 在test-server.xml中

    <Realm className="org.apache.catalina.realm.JAASRealm"
         appName="CustomJAASModule"
         userClassName="com.myapp.UserPrincipal, com.myapp.PasswordPrincipal"
         roleClassNames="com.myapp.RolePrincipal">
    </Realm>
    
    arquillian.xml中的

    <property name="serverXml">test-server.xml</property>
    
    1. 在测试中通过ShrinkWrap创建WebArchive时,用test-context.xml替换了context.xml

      @Deployment    
      public static WebArchive createDeployment() {
          WebArchive war = ShrinkWrap.create(WebArchive.class)
              .addPackages(true, Appointment.class.getPackage(), AppointmentsFacadeREST.class
              .getPackage(), ClassConstraints.class.getPackage())
              .addAsResource("test-persistence.xml", "META-INF/persistence.xml")
              .addAsResource("users.properties")
              .addAsResource("groups.properties");
      
          war.delete("WEB-INF/web.xml");
          war.delete("WEB-INF/context.xml");
          war.addAsWebInfResource("test-web.xml", "web.xml")
              .addAsWebInfResource("test-context.xml", "context.xml")
              .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
      
          return war;
      }
      
    2. (我出于某种原因无法格式化上述代码,尽管每行有4个前导空格)

      在常规服务器中一切运行顺利,我能够调试LoginModule并设置完全正常工作的断点,问题只在于嵌入式。

      我正在使用以下框架/技术:

      TomEE + 1.7.2(Jax-RS,OpenEJB等) JPA - OpenJPA / MySQL

      在Ubuntu 15.04上运行

      任何帮助都将非常感谢,并感谢先进。

2 个答案:

答案 0 :(得分:1)

我一直试图让这样的事情发挥作用,并且今天终于成功了。至于你的问题,你实际上可以将领域配置放在context.xml中。此外,JAAS领域还允许您设置配置文件的路径。所以,你有:

在test-context.xml中,添加以下行或完全替换它:

<Realm className="org.apache.catalina.realm.JAASRealm"
    appName="CustomJAASModule"
    configFile="login.config"
    userClassName="com.myapp.UserPrincipal, com.myapp.PasswordPrincipal"
    roleClassNames="com.myapp.RolePrincipal">
</Realm>

在你的测试类中(我冒昧用方便的方法替换你的一些代码):

@Deployment    
public static WebArchive createDeployment() {
    WebArchive war = ShrinkWrap.create(WebArchive.class)
        .addPackages(true, Appointment.class.getPackage(), AppointmentsFacadeREST.class
        .getPackage(), ClassConstraints.class.getPackage())
        .setWebXML("test-web.xml")
        .addAsManifestResource("test-context.xml", "context.xml")
        .addAsManifestResource("test-persistence.xml", "persistence.xml")
        .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml")
        .addAsResource("test-login.config", "login.config")
        .addAsResource("users.properties")
        .addAsResource("groups.properties");
    return war;
}

似乎你不能使用server.xml,因为JAAS身份验证所需的类需要在../arquillian-apache-tomee/lib/中,并且此时无法向该路径添加类。这种方法有效,因为web.xml,context.xml和persistence.xml优先于容器配置中的对应物。

答案 1 :(得分:0)

以上解决方案:

<Realm className="org.apache.catalina.realm.JAASRealm"
appName="CustomJAASModule"
configFile="login.config"
userClassName="com.myapp.UserPrincipal, com.myapp.PasswordPrincipal"
roleClassNames="com.myapp.RolePrincipal">
</Realm>

结果:jar:file:/ C:/Users/piotr/.m2/repository/org/apache/tomee/openejb-core/7.0.2/openejb-core-7.0.2.jar!/ login。配置错了。

您需要为文件选择不同/唯一的名称,例如:

<Realm className="org.apache.catalina.realm.JAASRealm" 
configFile="test-login.config" 
appName="FakeLoginModule"
userClassNames="org.jboss.security.SimplePrincipal"
roleClassNames="org.jboss.security.SimpleGroup" />

.addAsManifestResource("test-context.xml", "context.xml")
.addAsResource("test-login.config", "test-login.config")