当前位置: 代码迷 >> java >> Tomee嵌入式适配器+ Arquillian + Jax-RS-测试Jaas
  详细解决方案

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

热度:40   发布时间:2023-07-17 20:35:51.0

我目前在测试使用@RolesAllowed保护的Restful方法/路径时遇到麻烦,当用户通过自定义JAAS LoginModule登录时,这些角色将从数据库中拉出(我可以测试不需要的其余Rest方法/路径任何角色。)

我已经为此花了几天的时间,并且一直到处(特别是在SO中)寻找可以将我带到现在的位置的答案(我将在以后进行描述)。

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

我的问题如下:

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

我已经完成以下工作:

  1. 添加到Arquillian.xml(出于某种原因,SO省略了<property>标签。)

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

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

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

(尽管每行有4个前导空格,但由于某种原因我无法格式化上面的代码)

一切都可以在常规服务器上顺利运行,我能够调试LoginModule并设置断点,这些断点可以很好地工作,问题就在嵌入式系统中。

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

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

在Ubuntu 15.04上运行

任何帮助将不胜感激,并在此先感谢。

我一直在尝试使类似的东西正常工作,并且今天终于成功了。 对于您的问题,您实际上可以将领域配置放在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的优先级更高。

上面的解决方案:

<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.config中错误。

您需要为文件选择其他/唯一名称,例如:

<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")