gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:16:51 25 4
gpt4 key购买 nike

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

我已经储备了这几天的知识,并且到处寻找(特别是在 SO 中)寻找答案,这些答案引导我到达现在的位置,我将在前面描述)。

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

我的问题如下:

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

我已完成以下操作:

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

     <property name="catalina_opts">
    Djava.security.auth.login.config=$CATALINA_HOME/conf/jaas.config"
    </property>
  2. 已添加至 pom.xml在 Surefire 插件中:(由于某种原因,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>
  • 将 context.xml 替换为 test-context.xml测试中通过ShrinkWrap创建WebArchive时

     @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 将优先于容器配置中的对应项。

    关于java - Tomee 嵌入式适配器 + Arquillian + Jax-RS - 测试 Jaas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31721772/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com