Несмотря на то, что я все еще хотел бы знать, почему моя первоначальная установка отлично работает для сессионных компонентов без сохранения состояния, но не для сессионных компонентов с сохранением состояния, вот решение, которое я нашел:
Веб-приложение, которое также упаковано в EAR, выполняет свою аутентификацию через JAAS. Для этого я настроил домен безопасности в JBoss login-config.xml, который выглядит следующим образом:
<application-policy name="My-SD">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="unauthenticatedIdentity">guest</module-option>
<module-option name="dsJndiName">java:/myDS</module-option>
<module-option name="principalsQuery">SELECT PASSWORD FROM LOGIN WHERE LOGIN = ? AND STATUS > 0</module-option>
<module-option name="rolesQuery">SELECT ROLE, 'Roles' FROM USER_ROLE WHERE LOGIN = ?</module-option>
</login-module>
</authentication>
</application-policy>
Я использовал этот домен безопасности в jboss-web.xml веб-приложения, а также в jboss.xml EJB-проекта, хотя фактически я использую его только в веб-приложении (EJB доступны без аутентификации ).
Чтобы решить проблему с доступом к SFSB, мне просто нужно было удалить мой домен безопасности из jboss.xml в EJB-проекте. Это тогда заставляет JBoss использовать домен безопасности по умолчанию, который, кажется, делает правильные вещи, и мой клиент приложения, наконец, может получить доступ и использовать SFSB.