基本上(據我所知)在EJB 3.1的客戶端應用程序的安全性仍是像在2.x的,所以你應該找到例子。
你需要設置什麼:
- JAAS登錄服務器端模塊(正如你已經看到了網絡應用程序),決定如何處理身份驗證
- 客戶端
- 客戶端屬性文件回撥,提供憑證的客戶端驗證過程
- 使用類路徑上的屬性文件啓動客戶端
這對於JBoss,作爲一個例子,但我認爲你可以轉化爲其他服務器,這個想法是通用的:
# 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將你給從上面的auth.conf文件的背景下adb
。
的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
你正在尋找一個簡單的框架是JavaEE本身:-) –
OK,但你可以給我的例子嗎?我找到了一些JAAS示例,但始終使用Web應用程序。我沒有Web應用程序,但只有Java客戶端直接連接到ejb服務器。 – fxuser
我在網上找不到任何好的例子:(請幫忙 – fxuser