我目前在测试使用@RolesAllowed
保护的Restful方法/路径时遇到问题,当用户通过自定义JAAS LoginModule登录时,这些角色将从数据库中提取(我能够测试这些休息方法/不需要任何角色的路径。)
我已经在这里放了几天了,并且到处寻找(特别是在这里)以获得能够引导我到现在我所处的地方的答案,我将在前面描述。
我相信如果我将自定义LoginModule运行在TomEE嵌入式适配器(目前不是)上,我将能够登录用户。
我的问题如下:
如何在TomEE嵌入式适配器中设置选项-Djava.security.auth.login.config=path/to/login.config"
,以便将自定义LoginModule用作JAASRealm?
我做了以下事情:
已添加到Arquillian.xml(由于某种原因,我们省略了<property>
个标签。)
<property name="catalina_opts">
Djava.security.auth.login.config=$CATALINA_HOME/conf/jaas.config"
</property>
添加到surefire插件中的pom.xml :(由于某种原因,我们省略了<argline>
个标签。)
<argLine>
-Djava.security.auth.login.config=${project.basedir}/target/test-classes/conf/test-login.config"
</argLine>
在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>
在测试中通过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上运行
任何帮助都将非常感谢,并感谢先进。
答案 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")