我正在尝试以“业务”方式重新编写我的旧应用程序。
所以,我有一个带登录模块的Swing客户端,我自己的服务器是从头开始创建的。客户端使用ssl证书加密到服务器的TCP连接(我检查服务器上的客户端证书和客户端上的服务器证书),然后服务器使用数据库来验证和授权用户。
现在我正在尝试使用WildFly 8 CR1托管的ejb。 我想使用相同的客户端 - 服务器密钥对将Swing客户端连接到WildFly服务器,然后使用存储在MySQL数据源中的名称和凭据对用户进行身份验证。我还有存储在数据库中的角色,我想使用它们来配置客户端主体。
我有简单的基本EJB调用:
Context ctx = new InitialContext();
MyBeanRemote bean = (MyBeanRemote)ctx.lookup("AppName/module-0.0.1-SNAPSHOT/MyBean!my.app.MyBeanRemote");
ResultType result = bean.doSomething();
我有jndi.properties文件
java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
java.naming.provider.url=http-remoting://myServer:8080
jboss.naming.client.ejb.context=true
java.naming.security.principal=app-user-name
java.naming.security.credentials=password@123
我有基本的数据源配置
<datasource jta="false" jndi-name="java:jboss/datasources/MyDB" pool-name="MyDB" enabled="true" use-ccm="false">
<connection-url>jdbc:mysql://localhost:3306/Mydb</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver>mysql-connector-java-5.1.28-bin.jar</driver>
<security>
<user-name>mysqlUser</user-name>
<password>mysqlPass</password>
</security>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</datasource>
上面的一切都很好。
我已经阅读了一些指南,但仍然没有找到一个描述如何使用复合:EJB(不是web)+ WildFly 8(不是JBoss 7)+ SSL加密+通过数据源验证和授权登录客户端模块
任何帮助将不胜感激。
对不起我的英语,我经常使用这种语言阅读,而不是写作:)
答案 0 :(得分:2)
您需要创建一个映射到standalone.xml文件中的远程连接器的安全域,如下所示:
<management>
<security-realms>
<security-realm name="MyRealm">
<authentication>
<jaas name="my-domain"/>
</authentication>
</security-realm>
</management>
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
<connector name="remoting-connector" socket-binding="remoting" security-realm="MyRealm"/>
</subsystem>
然后,您应该使用正确的LoginModule(内置的或自己的)启用安全域:
<security-domains>
<security-domain name="my-domain" cache-type="default">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="dsJndiName" value="java:jboss/datasources/serviceDS"/>
<module-option name="principalsQuery" value="SELECT identificationCode FROM devices WHERE name=?"/>
<module-option name="rolesQuery" value="SELECT 'device', 'Roles' FROM devices WHERE name=?"/>
</login-module>
</authentication>
</security-domain>
</security-realms>
当然,数据源应该指向一个数据库,在该数据库中查询将找到适当的主体(用户)及其角色。 请务必查看有关远程处理的两篇文章:https://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+or+remote-naming+project和https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI。看起来你正在使用“旧”远程处理 - JBoss 7不再支持客户端登录模块。最重要的是你的ejb远程配置看起来应该更像(注意不允许的本地用户!):
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=8080
remote.connection.default.username=userName
remote.connection.default.password=password
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
请务必查看https://github.com/wildfly/quickstart/tree/master/ejb-remote
最后,请记住在jboss-ejb3.xml中添加安全域映射:
<jboss:ejb-jar>
<assembly-descriptor>
<s:security>
<ejb-name>*</ejb-name>
<s:security-domain>my-domain</s:security-domain>
</s:security>
</assembly-descriptor>
</jboss:ejb-jar