基本上(据我所知)EJB 3.1 中的客户端应用程序安全性仍然与 2.x 中的一样,因此您应该找到示例。
您需要设置的内容:
- 服务器端的 jaas 登录模块(正如您在 Web 应用程序中看到的那样)
- 确定如何处理身份验证的客户端属性文件
- 客户端回调,为客户端身份验证过程提供凭据
- 使用类路径上的属性文件启动客户端
这是 jboss-as 的示例,但我认为您可以将其翻译到其他服务器,因为这个想法是通用的:
# file auth.conf on the client
adb {
// jBoss LoginModule
org.jboss.security.ClientLoginModule required
;
};
这基本上说对于登录上下文adb
,客户端登录模块需要成功。此上下文adb
链接到服务器端的相应应用程序 jaas 上下文。
在代码中,您像这样设置登录:
CallbackHandler cbh =
new LoginCallbackHandler(user,pass.toCharArray());
try {
LoginContext lc = new LoginContext("adb",cbh);
lc.login(); // <--- triggers the show in the client
}
catch (LoginException e) {
System.err.println("Login failed: "+e.getMessage());
}
在 LoginContext 中,您adb
从上面的 auth.conf 文件中提供上下文。
LoginCallbackHandler
可能看起来像这样:
package de.bsd.adb.client;
import java.io.IOException;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
public class LoginCallbackHandler implements CallbackHandler {
private String user;
private char[] pass;
// Konstruktor
LoginCallbackHandler(String username,char[] password) {
user=username;
pass=password;
}
// handle() does the real work and is invoked from the client container
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException
{
// Iterate over the call backs
for (int i =0 ; i< callbacks.length; i++)
{
// NameCallback -> pass Login-Name
if (callbacks[i] instanceof NameCallback)
{
System.out.println("NameCallback");
NameCallback nc = (NameCallback)callbacks[i];
nc.setName(user);
}
// PasswordCallback -> pass Password
else if (callbacks[i] instanceof PasswordCallback)
{
System.out.println("PasswordCallback");
PasswordCallback pc =
(PasswordCallback)callbacks[i];
pc.setPassword(pass);
}
else { // unknown callback
throw new UnsupportedCallbackException(callbacks[i],"Ouch");
}}}
现在您可以启动您的客户端程序
java -Djava.security.auth.login.config=/path/to/auth.conf -cp bla my.Main