В основном (насколько я знаю) безопасность клиентского приложения в 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 вы даете контекст 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
Простая структура вы ищете JavaEE сам :-) –
ОК, но не могли бы вы дать мне пример? Я нашел несколько примеров JAAS, но всегда использовал веб-приложения. У меня нет веб-приложения, а только java-клиенты, напрямую подключающиеся к серверу ejb. – fxuser
Я не могу найти хороший пример в Интернете :(Пожалуйста, помогите – fxuser