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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как реализовать разграничение доступа, в веб приложении 
:(
    Опции темы
Synt
Дата 31.3.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



мне необходимо реализовать разграничение функционального доступа и доступа к данным.

использовать собираюсь JBoss AS, JBoss Seam (jsf), Hibernate, Oracle 8.1.7

1. как реализовывать функциональное разграничение доступа?
существующее решение: на страницу поставить constraint и с помощью jaas юзера проверять в базах данных
может существуют другие решения?

2. как реализовать разграничение доступа к данным?
имеется ввиду, чтобы пользователь А имел доступ к одним данным таблицы Т, а пользователь Б имел доступ к другим данным таблицы Т
существующее решение: сделать таблицу доступа:
Код

User Access       
A        1
Б        2



а у данных:
Код

Data AccKey
564       1
zxc       2
3df       1
xczs      2
3df       2


и при доступе к данным запрос похитрее написать, чтобы возвращал только нужныеданные. Или же отделять лишние данные в бизнес-слое и отдавать в представление.
Но мне кажется этот путь неудобным, может быть есть попроще решения? Например какая нибудь библиотека для подобного доступа, или это может быть в хибернейте реализовано?
Или, использовать встроенную оракловскую систему прав (этот путь мне тоже кажется неудобным)?

буду признателен за любые советы



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


Опытный
**


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

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



Synt, всё это можно сделать при помощи jaas, об этом подробнее на http://java.sun.com . И ещё здесь . Но есть более продвинутые и гибкие системы http://acegisecurity.org/ тоже основанные на jaas , но для работы требующие библиотеки spring. 

Открою тебе секрет, здесь на форуме работает поиск, полезная я бы сказал весч. Попробуй.


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Synt
Дата 31.3.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



спасибо, похоже acegisecurity действительно то что нужно. Попробую его покопать;)

поиск попробовал, инфа есть, но очень мало. Кроме того сей вопрос все формулируют по разному. В книжках он тоже не описан, шаблонов таких я не нашел. По каким словам искать на sun.com? как называется эта проблема?
PM MAIL   Вверх
Zamuta
Дата 31.3.2007, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Synt, acegisecurity обсуждается на форуме spring http://forum.springframework.org/forumdisplay.php?f=33 . 
Цитата
По каким словам искать на sun.com? как называется эта проблема?

Так и ищи "jaas". 

А вообще почитай сначала что-нибудь об этом на русском. И не забывай про поиск .


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Synt
Дата 1.4.2007, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



читаю сейчас книжку жаасбук

как я понимаю, для 1 вопроса это описанный путь является наиболее оптимальным. Функционал Асеги секьюрити здесь повторяет обычный жаас (ну разве что не придется переписывать хмл файлы при изменении сервера приложений).

относительно ответа на вопрос 2:
Хранению прав в таблицах как я понял альтернативы нет.

Тогда вопрос - как лучше реализовать проверку прав
1. Хранимыми процедурами - тогда придется использовать права оракла, предачу принципала внутрь базы данных - сложно.
2. Собственноручно писать код для этой проверки.
3. Использовать контроль доступа к данным жаасовский или асеги. Этот вариант незначительно сложнее 2, но красивее. Однако об этом почему то написано очень мало,  наверно мало кто использует все эти Пермишшены. 
 Правильно ли я понимаю, для проверки прав, нужно унаследоваться от ProtectionDomain и  реализовать в implies  ProtectionDomain проверку соотетсвие полученного Пермишшена тому,которые есть  в таблице?
PM MAIL   Вверх
Zamuta
Дата 1.4.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Synt, 
Цитата
Хранению прав в таблицах как я понял альтернативы нет.

Можешь хранить в *.property файле, например (у acegi). А чем не устраивает хранение прав в бд?

Все твои потребности можно решить с помощью acegi, читай подробнее http://acegisecurity.org/docbook/acegi.pdf . На счёт второго вопроса, я бы сделал так. Так как acegi позволяет разделить права на выполнение разных методов кода, то можно сделать чтобы одни методы возвращали тебе одни данные, при условии, что юзер обладает требуемыми правами и не возвращали другие если таковых прав нет. Т.е. одни методы возвращают одни данные, другие методы другие и у этих методов разные требуемые права доступа. 


--------------------
Thank you opensource.
PM MAIL ICQ   Вверх
Synt
Дата 1.5.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



прочитал наконец jaasbook.com

Вообще механизм очень удобный - на объекты добавляю пермишшены.

Затемжу провожу "отсев" записей с пермишшенами, например так:
Код


    public List getMyObjects() {
        EntityManager em = Persistence.createEntityManagerFactory("manager").createEntityManager();
        Query query = em.createQuery("select myObject from MyObject");

        List m = query.getResultList(); //получаю массив из ентити бина
        List retM = new ArrayList();

        for (int i = 0; i < m.size(); i++)
            try {
                MyObject currentMyObject = (MyObject) m.get(i);
                MyObjectPermission perm = new MyObjectPermission(currentMyObject, "read");
                AccessController.checkPermission(perm); // если пермишшена нет, будет экзепшен
                retM.add(currentMyObject);  //если прошел проверку, то добавляем в выходной массив            
            } catch (SecurityException e) {
                // если не прошел, то не добавляем
            }
        em.close();
        return retM;
    }




А потом методы сесионного бина, возвращающие данные вызывать с помощью Subject.doAsPrivileged().

Код

 Subject.doAsPrivileged(subject, new PrivilegedAction() {
public Object run() {
    System.out.println(getAllBean.getMyObject());
    return null;
}
}, null);


мне кажется,  каждый метод оборачивать doAsPrivileged() - не слишком ли нудно? может быть как нибудь этого можно избежать? Будет ли AccessController.checkPermission(perm) работать правильно если вызывать getMyObjects() без doAsPrivileged()



и как хранить пермишшены в БД? Нужно их брать из базы при старте приложения, добавлять в PermissionService, такой путь работает? 
Тогда будет трудно поддерживать  соответсвие - удалил админ пермишшен - его нужно и из базы удалить, и из PermissionService.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0972 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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