2012-10-18 4 views
2

У меня есть приложение EJB 3.1 и java-клиенты, подключающиеся к этому приложению. Мне нужно создать аутентификацию пользователя.Простая аутентификация в EJB 3.1

Пример:

class LoginBean{ 

public remoteLogin(String login, String password){ 
    // create user context with user ID 
} 
} 

class BeanAbc{ 
    public remoteSecureMethod(){ 
     // get user context - if no context throw error 
     // get user ID/login from user context and do some additional logic.. 
    } 
} 

учетные данные пользователя хранятся в БД. Я использую сервер Glassfish. Как сохранить пользовательский контекст? Какое лучшее решение? Есть ли просто рамки?

+3

Простая структура вы ищете JavaEE сам :-) –

+1

ОК, но не могли бы вы дать мне пример? Я нашел несколько примеров JAAS, но всегда использовал веб-приложения. У меня нет веб-приложения, а только java-клиенты, напрямую подключающиеся к серверу ejb. – fxuser

+1

Я не могу найти хороший пример в Интернете :(Пожалуйста, помогите – fxuser

ответ

1

Вы должны обязательно посмотреть на Spring Security, который является стандартной базой безопасности для приложений Java EE. Даже если вы используете только крошечную часть фреймворка в начале, он поместит вас на правильный путь и позволит вам развиваться по мере необходимости (если вы хотите переключить метод аутентификации, управлять авторизацией и т. Д.).

1

В основном (насколько я знаю) безопасность клиентского приложения в 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 
0

Я хотел бы добавить к ответу, предоставленной @Heiko Рапп - Кодекса он предоставит вам работу как отдельное приложение. Если вы используете сервер приложений, вы должны проверить, как настроить модули JAAS с помощью конфигурации сервера приложений.
Например, в проекте oVirt с открытым исходным кодом мы используем модуль входа в Kerberos.
В настоящее время мы используем JBoss AS 7.
Мы настроили автономный.XML-файл конфигурации, определяя безопасности-домен в разделе безопасности доменов -

<security-domain name="EngineKerberosAuth"> 
        <authentication> 
         <login-module code="com.sun.security.auth.module.Krb5LoginModule" flag="required"/> 
        </authentication> 
       </security-domain> 
Смежные вопросы