2017-01-06 10 views
0

В проекте на основе JHipster нам необходимо выборочно отфильтровать определенные столбцы на основе роли/пользователя, входящего в систему. Все пользователи смогут просматривать/изменять большинство столбцов, но только некоторые привилегированные пользователи смогут просматривать/изменять определенные защищенные поля/столбцы.JHipster Ролевая маскировка определенных столбцов

Похоже, что единственный способ сделать это - использовать EntityListeners. Я могу использовать EntityListener и маскировать определенный столбец во время события PostLoad. Скажем, например, я маскирую столбец my_secure_column с XXX и отображаю его пользователю.

Пользователь затем изменяет некоторые другие поля/столбцы (к которым у него есть доступ) и отправляет форму. Должен ли я снова захватить частично заполненный объект в событии PreUpdate, получить исходное значение для my_secure_column из базы данных и установить его перед сохранением?

Все это кажется неэффективным. Проработал несколько часов, но не смог найти конкретную реализацию, которая наилучшим образом соответствует этому варианту использования.

Редактировать 1: Это выглядит как первый шаг к достижению этого в несколько лучшем виде. Updating Entities with Update Query in Spring Data JPA

Я мог бы использовать определенные частичные обновления, такие как updateAsUserRole, updateAsManagerRole и т. Д., А не постоянно сохранять всю сущность.

@Repository 
public interface CompanyRepository extends JpaRepository<Company, Integer> { 
    @Modifying(clearAutomatically = true) 
    @Query("UPDATE Company c SET c.address = :address WHERE c.id = :companyId") 
    int updateAddress(@Param("companyId") int companyId, @Param("address") String address); 
} 

ответ

1

Безопасность на основе столбцов - непростая задача решить проблему, особенно в сочетании с JPA.

В идеале вам нравится избегать загрузки столбцов, но поскольку вы выбираете объекты, это невозможно по умолчанию, поэтому вам нужно удалить ограниченный контент, переопределив значение после загрузки.

В качестве альтернативы вы можете создать компонент вида (POJO), а затем использовать JPQL Constructor Expression. Лично я бы использовал CriteriaBuilder. construct() вместо конкатенации JPQL-запроса, но тот же принцип.

Что касается обновления данных, пользовательский интерфейс должен приводить к невозможности редактирования ограниченных полей. Однако вам все равно нужно проверить на бэкэнд, и я бы рекомендовал вам проверить, изменился ли столбец, прежде чем вызывать JPA. Как правило, у вас есть изменения в DTO, и в любом случае необходимо будет загрузить Entity, если был изменен ограниченный столбец, вы отправите сообщение об ошибке. Таким образом вы только вызываете JPA после проверки безопасности.

+0

В JHipster, как правило, при обновлении данные напрямую привязаны к объекту (нет необходимости в отдельном DTO). Итак, в обычном случае мы не загружаем Entity. Это просто обновление/сохранение связанного объекта, полученного от браузера. Но для этого конкретного случая использования, похоже, нам придется снова загружать объект, сравнивать и объединять. Это кажется расточительным упражнением. – user1880957

+0

Я посмотрел на JHipster, и, хотя он подводит вас к работе, я никогда не буду использовать его для производства. Как и в случае с любым генератором кода, пытаясь создать общую систему подгонки, она всегда будет терпеть неудачу (мое 13-летнее мнение). У нас есть ресурс Junior, который хотел использовать JHipster, и он дает вам хорошее представление о том, какие компоненты нужны, но вы должны создать новый проект и убрать жир. - Проект по умолчанию (монолитный) JHipster - это 5000 + строк, как правило, вы нужно 10% от этого, остальное нужно каким-то образом настроить. Сделайте себе одолжение и узнайте Spring (Core, Boot, Security, Data) –

+0

Я никогда не использовал тот же класс, что и Entity и DTO. Я знаю, что большинство инфраструктур JPA предлагают встроенные службы REST для управления данными, но, по моему опыту, это ошибка. Существуют просто разные требования к объекту и DTO, и вам часто требуется уровень безопасности перед обновлением базы данных.Создание в качестве DTO для вас сущностей - это одноразовая задача около 1-5 минут, это ничто по сравнению с тем временем, когда вы потратите mangeling на класс сущности, чтобы заставить его делать оба. Вы можете смириться с этим вопросом или узнать его сами;) –