摘要
总要写jboss-ejb-client.properties在客户端中,是不是让产品显得非常不专业?专业的产品一定是要求服务端ip和port能在代码中配置。这一节的主要目的就是解决这个问题。本文主要内容包括,
- 首先作为预备知识介绍一下JBOSSEAP 6 (JBOSS AS 7)的两种用户类型。
- 然后进入正题介绍配置了用户的EJB客户端,包括jboss-ejb-client.properties中的配置,和完全甩掉jboss-ejb-client.properties的配置方式。
一、JBOSS用户
这部分本身对JBOSS的配置是很有意义的,因为内容不多就直接放到这里作为预备知识介绍。
在$JBOSS_HOME/bin下面有一个命令add-user.bat(add-user.sh),运行之后有两种用户类型可选,管理用户和应用型用户,重点介绍应用型用户。
1.1 管理用户
管理用户用于对JBOSS控制台的管理,不再有默认用户可以直接进入web-console去管理jboss。所有的管理员用户都需要从这里配置出来。配置内容如下,
你要添加哪个类型?
a) 管理型用户 (mgmt-users.properties)
b) 应用型用户(application-users.properties)
(a): a
输入要添加的新用户的细节。
使用从现有属性文件发现的区'ManagementRealm'。
用户名: adminleo
密码:
重新输入密码:
你希望这个用户属于哪些组?(请输入一个用逗号隔开的列表,或者留空表示没有)[ ]:
将要添加域'adminleo' 的用户'ManagementRealm'
这是正确的吗? yes/No? yes
添加用户'adminleo' 至 'E:\server\jboss-eap-6.2\standalone\configuration\mgmt-users.properties'
添加用户'adminleo' 至'E:\server\jboss-eap-6.2\domain\configuration\mgmt-users.properties'
添加属于组adminleo 的用户'' 到文件'E:\server\jboss-eap-6.2\standalone\configuration\mgmt-groups.properties'
添加属于组adminleo 的用户'' 到文件'E:\server\jboss-eap-6.2\domain\configuration\mgmt-groups.properties'
这个新用户将用于AS 进程来连接另外一个AS 进程(如从域控制器)?
例如,用于连接到主控制器的从主机控制器、用于服务器和服务器间的EJB 调用的远程连接。
yes/no? yes
要表示这个用户,在server-identities 定义<secret value="YWRtaW4xMjNsZW8rKw==" /> 里添加下列内容。
请按任意键继续.. .
配置之后就可以使用用户名密码登陆了,web-console默认登陆端口9990
1.2 应用型用户
应用型用户不能管理JBOSS,但是可以使得客户机能够远程调用服务。这可以配置给客户使用。具体配置如下,
你要添加哪个类型?
a) 管理型用户 (mgmt-users.properties)
b) 应用型用户(application-users.properties)
(a): b
输入要添加的新用户的细节。
使用从现有属性文件发现的区'ApplicationRealm'。
用户名: utmleo
密码:
重新输入密码:
你希望这个用户属于哪些组?(请输入一个用逗号隔开的列表,或者留空表示没有)[ ]:
将要添加域'utmleo' 的用户'ApplicationRealm'
这是正确的吗? yes/No? yes
添加用户'utmleo' 至'E:\server\jboss-eap-6.2\standalone\configuration\application-users.properties'
添加用户'utmleo' 至'E:\server\jboss-eap-6.2\domain\configuration\application-users.properties'
添加属于组utmleo 的用户'' 到文件'E:\server\jboss-eap-6.2\standalone\configuration\application-roles.properties'
添加属于组utmleo 的用户'' 到文件'E:\server\jboss-eap-6.2\domain\configuration\application-roles.properties'
这个新用户将用于AS 进程来连接另外一个AS 进程(如从域控制器)?
例如,用于连接到主控制器的从主机控制器、用于服务器和服务器间的EJB 调用的远程连接。
yes/no? yes
要表示这个用户,在server-identities 定义<secret value="dXRtMTIzKysr" /> 里添加下列内容。
请按任意键继续.. .
注意到最后这段:
这个新用户将用于AS 进程来连接另外一个AS 进程(如从域控制器)?
例如,用于连接到主控制器的从主机控制器、用于服务器和服务器间的EJB 调用的远程连接。
yes/no? yes
选择了yes之后,会获得系统为用户utmleo生成的一个新的秘钥值:dXRtMTIzKysr。下节将详细介绍如何配置有用户名秘钥进客户端。
二、EJB客户端扩展
接上一节,我们配置了用户utmleo,获得秘钥dXRtMTIzKysr。本节分两部分,配置用户名密码进客户端,
- 独立JAVA客户端
- JBOSS客户端
2.1 独立的JAVA客户端
如前一篇文章《JBOSS EAP 6.1 系列四 EJB客户端--让人又爱又恨的JNDI》介绍的,JAVA客户端由两部分组成:
- jboss-ejb-client.properties
- 客户端代码
用户名密码可以单独配置在这两部分之中。
2.1.1 用户名秘钥在配置文件中的配置方式
首先看jboss-ejb-client.properties的配置,增加3个配置项:
remote.connection.default.username=<用户名>
remote.connection.default.password=<秘钥>
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=<用户类型>
之后可获得如下配置:
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=localhost
remote.connection.default.port=4447
remote.connection.default.username=utmleo
remote.connection.default.password=dXRtMTIzKysr
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
客户端代码不需要任何修改。
2.1.2 用户秘钥在客户端代码中的配置(不再需要配置文件的辅助)
有用户名秘钥最直接的好处在于可以把jboss-ejb-client.properties文件完全甩开。直接在代码中配置IP和PORT。直接上代码,
packagecom.hp.leo.ejb.client;
importjava.util.Properties;
importjavax.naming.Context;
importjavax.naming.InitialContext;
importjavax.naming.NamingException;
importcom.hp.leo.HelloWorld;
public classHelloClient {
public static voidmain(String[] args) {
finalProperties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
env.put(Context.PROVIDER_URL, "remote://localhost:4447");
env.put("jboss.naming.client.ejb.context", "true");
env.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
env.put(Context.SECURITY_PRINCIPAL, "utmleo");
env.put(Context.SECURITY_CREDENTIALS, "dXRtMTIzKysr");
try {
Contextcontext = new InitialContext(env);
HelloWorldh1 = (HelloWorld) context.lookup("HelloWorld/HelloWorldBean!com.hp.leo.HelloWorld");
System.out.println(h1.sayHello());
} catch(NamingException e) {
e.printStackTrace();
}
}
}
这样就可以完全不用jboss-ejb-client.properties文件了。
2.2 JBOSS Server客户端
JBOSS Server中的JSP或者servlet也想调用其他机器的EJB,但不想再有jboss-ejb-client.properties?这部分就介绍在JBOSS客户端中用户名秘钥的配置,
打开$JBOSS_HOME\standalone\configuration\standalone.xml文件,
创建securityrealm
<security-realm name="ejb-security-realm">
<server-identities>
<secret value="dXRtMTIzKysr"/>
</server-identities>
创建remote-outbound-connection
<outbound-socket-binding name="remote-ejb">
<remote-destination host="localhost"port="4447"/>
</outbound-socket-binding>
创建outbound-socket-binding
<subsystemxmlns="urn:jboss:domain:remoting:1.1">
……
<outbound-connections>
<remote-outbound-connectionname="remote-ejb-connection"outbound-socket-binding-ref="remote-ejb"username="utmleo"security-realm="ejb-security-realm">
<properties>
<property name="SASL_POLICY_NOANONYMOUS"value="false"/>
<property name="SSL_ENABLED" value="false"/>
</properties>
</remote-outbound-connection>
</outbound-connections>
</subsystem>
小结
本文基于JBOSS Application user的创建,介绍了有用户之后给客户端变成带来的便利,以及在JAVA和JBOSS Server的客户端中用户名秘钥的具体配置。希望能给一直被jboss-ejb-client.properties或者jboss-ejb-client.xml困扰着的朋友一些帮助。