JHipster Ролевая маскировка определенных столбцов

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

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

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

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

Редактировать 1: Это выглядит как первый шаг к достижению этого в несколько лучшем виде. Обновление сущностей с помощью запроса на обновление в 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, и вам все равно нужно будет загрузить сущность. Если измененный столбец был изменен, вы отправите ошибку обратно. Таким образом, вы звоните в JPA только после проверки безопасности.

Другие вопросы по тегам