Скрыть / переназначить значения полей в объекте Hibernate на основе разрешений пользователя - PullRequest
1 голос
/ 21 июля 2011

В приложении Spring 2.6 / JPA 1 / Hibernate 3.3 мне нужно «скрыть» некоторые данные полей сущностей на основе разрешений текущего пользователя.

Например, у сущности "Документ" есть поле "заголовок", которое отображается на столбец заголовка в таблице DOC.В зависимости от разрешения пользователя заголовок должен либо читать «КОНФИДЕНЦИАЛЬНО», если ему / ей не разрешено читать заголовок, либо он должен просто содержать правильное значение, полученное из базы данных.То же самое относится ко многим другим свойствам.

Проблема в том, что я не могу применить модель представления или некоторую фильтрацию в пользовательском интерфейсе.Это связано с тем, что объекты сущностей будут переданы на другой уровень, который заботится о последующей обработке и, наконец, отображает данные в пользовательском интерфейсе, и реальные данные (т. Е. Реальное значение «title») не должны передаваться этому уровню в терминахбыть общедоступным.Таким образом, сам объект сущности должен быть «запечатан» без реального значения, доступного через API - но сущность, конечно, может сохранять свое состояние внутри.

Наивный подход будет заключаться в получении списка объектов Document,затем переберите его и установите заголовок «КОНФИДЕНЦИАЛЬНО», если пользователь не разрешен.Конечно, это изменит сущность, поэтому, когда она будет отправлена ​​обратно на уровень постоянства, при слиянии значение заголовка («КОНФИДЕНЦИАЛЬНО») будет записано в базу данных - что, конечно, не должно происходить в любом случае.

Так что либо мне придется написать пользовательские операторы вставки / обновления для этих объектов (много работы) и / или написать пользовательскую логику загрузчика, которая обменивается данными в объекте - но опять же, я не знаю, какхранить и отслеживать исходное состояние объекта, когда дело доходит до слияния.Кроме того, это не удастся при использовании JPQL / HQL, а не EM-методов для загрузки.

Итак, у меня следующие вопросы:

  • , какие параметры у меня есть, чтобы "переназначить"значение в сущности на основе текущего пользователя, не нарушая механизм обновления / слияния?
  • Могут ли здесь помочь перехватчики (в стиле Hibernate или Spring / AOP)?Но опять же: как справиться со слиянием?

Спасибо, Дуайт

1 Ответ

0 голосов
/ 21 июля 2011

Один вариант, который приходит на ум, - это написать пружинный аспект для применения на соответствующем уровне вашего приложения (сервисный уровень?), Который будет переключать значения, когда объекты пересекают границу уровня.На выходе это изменит значение с «моего секретного значения» на «КОНФИДЕНЦИАЛЬНО» и запомнит старое значение и из какой сущности оно пришло.Затем, если / когда сущность передана обратно, она установит «мое секретное значение» на свое место.Таким образом, на вашей стороне границы у сущностей всегда будут правильные значения, но секретные значения никогда не покидают границы и поэтому никогда не могут быть скомпрометированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...