В проекте на основе 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);
}
В JHipster, как правило, при обновлении данные напрямую привязаны к объекту (нет необходимости в отдельном DTO). Итак, в обычном случае мы не загружаем Entity. Это просто обновление/сохранение связанного объекта, полученного от браузера. Но для этого конкретного случая использования, похоже, нам придется снова загружать объект, сравнивать и объединять. Это кажется расточительным упражнением. – user1880957
Я посмотрел на JHipster, и, хотя он подводит вас к работе, я никогда не буду использовать его для производства. Как и в случае с любым генератором кода, пытаясь создать общую систему подгонки, она всегда будет терпеть неудачу (мое 13-летнее мнение). У нас есть ресурс Junior, который хотел использовать JHipster, и он дает вам хорошее представление о том, какие компоненты нужны, но вы должны создать новый проект и убрать жир. - Проект по умолчанию (монолитный) JHipster - это 5000 + строк, как правило, вы нужно 10% от этого, остальное нужно каким-то образом настроить. Сделайте себе одолжение и узнайте Spring (Core, Boot, Security, Data) –
Я никогда не использовал тот же класс, что и Entity и DTO. Я знаю, что большинство инфраструктур JPA предлагают встроенные службы REST для управления данными, но, по моему опыту, это ошибка. Существуют просто разные требования к объекту и DTO, и вам часто требуется уровень безопасности перед обновлением базы данных.Создание в качестве DTO для вас сущностей - это одноразовая задача около 1-5 минут, это ничто по сравнению с тем временем, когда вы потратите mangeling на класс сущности, чтобы заставить его делать оба. Вы можете смириться с этим вопросом или узнать его сами;) –