ACL на уровне поля в Grails - PullRequest
       22

ACL на уровне поля в Grails

2 голосов
/ 23 января 2010

в нашем новом программном проекте у нас есть следующее требование: На веб-странице должен быть указан набор данных. Эти данные должны быть доступны для редактирования одним пользователям (назначены ролям, т. Е. Руководителю) и доступны только для просмотра другим пользователям. Сложная часть описывается примером:
Страница пользователя состоит из адресных данных и учетной записи. Данные адреса должны редактироваться пользователем и менеджером и просматриваться всеми пользователями, в то время как информация об учетной записи должна просматриваться только фактическим пользователем и менеджером.

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

Итак, вопрос: как решить эту проблему с помощью Grails?

Заранее большое спасибо,

С уважением, Даниил

Ответы [ 4 ]

0 голосов
/ 05 февраля 2010

А как насчет создания класса ACL следующим образом:

class ACL(val entry: Entry*) {
  def isAccessAllowed(subject: String, permission: String): Boolean = ...
}

class Entry(val subject: String, val permission: String*)

использование:

new ACL(
  new Entry("dave", "read", "write"), 
  new Entry("linda", "read")
)

(Этот пример в Scala, потому что я нашел его более выразительным в этом случае, но его легко перенести в Groovy.)

Затем вы должны связать объект ACL с защищаемым объектом.

0 голосов
/ 23 января 2010

Я, я бы закодировал его в классе домена, эмулируя способ, которым GORM предлагает вам аннотировать классы домена (static access = [field1: "ROLE_USER", field2: "ROLE_ADMIN,ROLE_USER"] в качестве примера). Затем создайте метод, который ваш контроллер может использовать для редактирования их для данного пользователя. Этот метод может использовать аннотации класса домена, чтобы решить, как его редактировать. Затем метапрограммируйте его на каждый из классов доменов, как это делают плагины.

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

Тогда вы можете просто использовать instance.redact(user) или instance.bindData(params, user), чтобы делать то, что вы хотите, и это практически декларативный синтаксис.

0 голосов
/ 05 февраля 2010

У нас похожая ситуация, и мы используем тег ifUserHasRole в gsp для запуска соответствующей презентации, и у нас есть фильтр, который применяет правила, основанные на вызываемом действии. Например, на пользовательском контроллере мы позволяем только ролям управления вызывать действие сохранения или если user.id совпадает с session.user.id. Казалось, это лучший вариант для нашей ситуации.

0 голосов
/ 23 января 2010

Spring Security (плагин Acegi) - определенно путь к Grails.

Существует taglib , который вы можете использовать, что позволит странице различаться для разных ролей, например:

<g:ifUserHasRole roles="ROLE_ADMIN">
html code for extra fields
</g:ifUserHasRole>
...