kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 FMQ
FMQ
Вопрос

Как вызвать dbms_application_info с помощью инъекции EntityManager

Мы создаем приложение Java EE / JPA / CDI с базой данных Oracle. Модель данных (которую мы не можем изменить) реализует безопасность частично с помощью представлений и client_info... что-то вроде...

create view the_view
as select * 
from the_table
where organization_id = USERENV('CLIENT_INFO')

где userenv('CLIENT_INFO') в основном устанавливается вызовом

dbms_application_info.set_client_info(11);

Итак, у нас есть ряд Stateless Beans, которые в основном используют Persistence Context и выполняют запросы (как собственные запросы, так и обычные POJO), и нам нужен способ ввести информацию о клиенте (которую мы можем получить из контекста безопасности) в PersistenceContext, прежде чем делать вызовы к EntityManager.

В двух словах, мне нужно иметь возможность вызывать следующее...

@PersistenceContext 
EntityManager em;

@Inject
UserInfo userInfo;

public TheView getTableData(long id) {
    // At this point security Information should be set.. 
    // Call the query
    return em.find(TheView.class, id);

}

без необходимости вызывать setClientInfo() вручную...

Одним из способов сделать это, вероятно, будет использование перехватчиков, аннотирование метода и вызов там (при условии, что я смогу получить PersistenceContext, который будет использовать метод. )... будет ли это вообще работать?

Есть ли другой способ сделать это?

TIA!

1 2012-05-28T15:59:41+00:00 2
Arjan Tijms
Arjan Tijms
Редактировал вопрос 23-го июня 2012 в 11:18
Программирование
jpa
cdi
Решение / Ответ
jan groth
jan groth
28-го мая 2012 в 8:19
2012-05-28T20:19:18+00:00
Дополнительно
Источник
Редактировать
#16297300

Подход с использованием перехватчиков, о котором вы пишете, кажется, отлично подходит.

Я не уверен на 100%, правильно ли я понял ваши требования, но кажется, что было бы неплохо отделить логику авторизации от реальной бизнес-логики, чтобы иметь возможность написать что-то подобное:

...

@IsEditor("someMoreData")
public X getData() {
 ...
}

IsEditor является перехватчиком и будет инкапсулировать соответствующий поиск в БД.

Seam Security как независимые модули CDI поставляются с парой концепций (& реализаций), вы должны обязательно ознакомиться с ними.

Chapter 34. Security - Authorization
docs.jboss.org
1
0
 James
James
29-го мая 2012 в 12:36
2012-05-29T12:36:26+00:00
Дополнительно
Источник
Редактировать
#16297301

Если вы используете EclipseLink, здесь есть информация об использовании EclipseLink с Oracle VPD, которая кажется похожей.

В принципе, вы можете использовать события для выполнения вашего вызова.

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Shared_and_Isolated#Oracle_Virtual_Private_Database_.28VPD.29

0
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией