2015-09-23 6 views
1

Я создаю новое приложение с Spring и Mysql (но я свободен использовать другие вещи) В этом приложении пользовательские журналы не могут видеть все данные (кроме пользователя 'admin'). Существует дерево группы, пользователи в группе. Пользователь может видеть только пользователей (или другие объекты) своей группы (или группы потомков).Фильтрация данных всего запроса

Я пытаюсь найти идею, чтобы сделать это «элегантно»: Например, если я пишу: productDao.findAll(), он возвращает весь продукт allready, не переписывая весь запрос во всех DAO.

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

+0

Где вы планируете держать эти ограничения на то, что различные пользователи могут/не могут видеть? Вещи, на которые нужно обратить внимание, будут использовать разные единицы сохранения для конфиденциальных пользователей или даже использовать параметры базы данных, такие как аутентификация прокси-сервера Oracles, описанная здесь. Https://blogs.oracle.com/olaf/entry/using_oracle_proxy_authenticat – Chris

ответ

2
  1. Используйте Spring Security 4. Он также поддерживает роли и иерархические роли
  2. Используйте Spring Data JPA для создания ваших DAO. Он интегрируется с Spring Security 4

Вот пример написания DAO с использованием Spring Data JPA. Вы пишете интерфейс, и SDJ создает для вас класс.

public interface ProductRepository extends JpaRepository<Product, Long> { 

    @Query("select e from #{#entityName} e where e.owner = ?#{principal?.username}") 
    Page<Product> findAll(Pageable pageable); 
} 

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

Вам нужно создать компонент, проходящий EvaluationContextExtensionSupport для экспрессии в ?#{principal?.username} безопасности для работы

+0

Это почти наше текущее решение, но я стараюсь найти решение без перезаписи всех запросов. Например, аннотация для класса сущности с вашим фильтром «e.owner =? # {Main? .username}» **, которые работают вместе с complexe, тоже **. (я думаю, я пытаюсь найти что-то невозможное, но я пытаюсь ...) – Charles

Смежные вопросы