Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EJB + Application Client. Вопросы авторизации 
:(
    Опции темы
Temdegon
Дата 22.6.2010, 02:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 11.10.2008
Где: Minsk

Репутация: нет
Всего: 9



Делаю простой EJB-клиент для POS-терминала. Помогите пожалуйста определиться с парой вопросов. Опыта мало, всех возможностей EJB не знаю, решил проконсультироваться, пока не наизобретал велосипедов и дров не наломал.
Сначала хотел сделать несколько stateless-бинов, со всякими бизнес-методами, и вызывать их из клиента через remote-интерфейс:
MenuManager - бин для работы с меню (получение всяких списков, редактирование меню), OrderManager - бин для формирования и управления заказами, EmployeeManager и т.п. Во всех бинах нужна инфа о юзере, который их использует. Но тут встал вопрос, как проводить авторизацию и аутентификацию юзера, как поддерживать пользовательскую сессию, как в session beans опознавать пользователя. Не передавать же в каждый метод обьект User. Полистал в паре книжек про JAAS, но нифига не понятно. Примеры какие-то или слишком простые или слишком запутанные. Можно как-нить сделать авторизацию по простому, чтоб пользователь передал логин + хэш пароля, эти данные сверились с записями в БД, юзер получил соответствующие права, а потом в самих бинах как-то узнавать, кто им конкретно пользуется? В общем, посоветуйте пожалуйста что-нить, ткните примерами. Хотелось бы вызывать из клиента MenuManager.doSmthWithOrder(), но не передавать непосредственно в вызов этого метода ни каких данных о юзере, но тем не менее в самом методе обновить пару полей, указывающих на то, что заказ последний раз редактировал Вася Пупкин.
Нормальным ли решением будет сделать эти бины stateful, перед использованием вызывать какой-нить метод для авторизации loginUser(login, pass), который будет проверять логин\пароль, хранить в себе ссылку на этого юзера и его уровень доступа, а потом в самих методах проверять 
Код

    void doSmthWithOrder() {
        if (this.user.getAccessLevel < 3) {
            throw IOException;
        } else {
           ...
           do something useful         
                   
        }
    }

Как мне в этом случае избежать авторизации в остальных бинах, чтоб я вызывал этот метод только в одном бине, а не для каждого?
 

PM MAIL   Вверх
ki6opr
Дата 22.6.2010, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 20.12.2006

Репутация: нет
Всего: нет



посмотрите например тут

PM MAIL ICQ   Вверх
eros2
Дата 22.6.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 31.5.2010

Репутация: нет
Всего: нет



В предыдущем посте ссылка на доку для старой Java EE, смотрите поновее, например:

Java EE 6 - http://download.oracle.com/docs/cd/E17410_.../doc/bnbyl.html
Java EE 5 - http://download.oracle.com/docs/cd/E17477_.../doc/bnbyl.html

Добавлено через 5 минут и 48 секунд
Пример простейшего клиента с авторизацией (используется вместе с JBoss, думаю для других AS будет аналогично.)
Сама авторизация в JBoss настраивается в conf\login-config.xml.

Код

import java.util.Collections;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
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;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.LoginContext;

public class Test
{
    static String user = "USER";
    static String pass = "password";

    public static void main( String[] arg ) throws Exception
    {
        CallbackHandler handler = new LoginHandler();
        LoginContext lc = new LoginContext( "test", null, handler, new LogConf() );
        lc.login();
        
        Properties properties = new Properties();
        properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        properties.put(Context.PROVIDER_URL, "localhost");
        Context ctx = new InitialContext( properties );

        Object ref = ctx.lookup( "TestBean/remote" );
        TestBeanRemote b = (TestBeanRemote)ref;

        b.mySecureMethod();
    }

    static class LoginHandler implements CallbackHandler
    {
        @Override
        public void handle(Callback[] callbacks) throws UnsupportedCallbackException
        {
            for (int i = 0; i < callbacks.length; i++) {
                if (callbacks[i] instanceof NameCallback) {
                    NameCallback nc = (NameCallback)callbacks[i];
                    nc.setName( Test.user );
                } else if (callbacks[i] instanceof PasswordCallback) {
                    PasswordCallback pc = (PasswordCallback)callbacks[i];
                    pc.setPassword( Test.pass.toCharArray() );
                } else {
                    throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
                }
            }
        }
    }

    static class LogConf extends javax.security.auth.login.Configuration
    {

        @Override
        public AppConfigurationEntry[] getAppConfigurationEntry(String name)
        {
            AppConfigurationEntry[] ace = new AppConfigurationEntry[1];
            ace[0] = new AppConfigurationEntry("org.jboss.security.ClientLoginModule",
                                AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
                                Collections.<String, Object>emptyMap());
            
            return ace;
        }

    }
}

PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0747 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.