问题描述
我目前在测试使用@RolesAllowed
保护的Restful方法/路径时遇到麻烦,当用户通过自定义JAAS LoginModule登录时,这些角色将从数据库中拉出(我可以测试不需要的其余Rest方法/路径任何角色。)
我已经为此花了几天的时间,并且一直到处(特别是在SO中)寻找可以将我带到现在的位置的答案(我将在以后进行描述)。
如果我使我的自定义LoginModule在TomEE嵌入式适配器上运行(目前还不能),我相信我将能够登录用户。
我的问题如下:
如何在TomEE嵌入式适配器中设置选项-Djava.security.auth.login.config=path/to/login.config"
,以便将我的自定义LoginModule用作JAASRealm?
我已经完成以下工作:
添加到Arquillian.xml(出于某种原因,SO省略了
<property>
标签。)<property name="catalina_opts"> Djava.security.auth.login.config=$CATALINA_HOME/conf/jaas.config" </property>
在
<argline>
插件中添加到pom.xml<argline>
由于某种原因,SO省略了<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上运行
任何帮助将不胜感激,并在此先感谢。
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的优先级更高。
2楼
上面的解决方案:
<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")