Grails - доступ только для владельца объекта - PullRequest
2 голосов
/ 29 июня 2010

Я все еще работаю над своим первым приложением Grails. На этот раз моя проблема - ограничить доступ к некоторым действиям для определенных пользователей.

Предположим, пользователи добавляют какой-то объект, например, книг. Я хотел бы предоставить доступ к редактированию книги только администратору и пользователю, добавившему книгу. В настоящее время я использую плагин Acegi. Я знаю, что есть более новая версия этого плагина, но я не уверен, что он что-то меняет в моей проблеме.

Вторая вещь чем-то похожа. У меня есть боковая панель, и есть «Hello $ {currentUser.username}. CurrentUser - это метод, который возвращает экземпляр текущего зарегистрированного пользователя. Но проблема в том, что я понятия не имею, где я могу поместить это сообщение, чтобы иметь возможность использовать его везде. Должен ли я поместить его в какой-то сервис и включить его везде? Я пытался создать ApplicationController, который расширяется всеми другими контроллерами, но, похоже, не работает. У вас есть какие-нибудь идеи?

Спасибо! Гжегож

Ответы [ 2 ]

5 голосов
/ 29 июня 2010

Вы должны использовать более новый плагин Spring Security Core, так как он имеет дополнительный плагин ACL, который делает именно то, что вы ищете.Подробнее см. http://grails.org/plugin/spring-security-acl.

По второму вопросу для этого есть taglib.В плагине Acegi используйте это:

Hello <g:loggedInUserInfo field="username"/>

(см. http://www.grails.org/AcegiSecurity+Plugin+-+Artifacts), а в плагине Spring Security Core используйте это:

Hello <sec:username/>

(см. Раздел «Теги безопасности» http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/)

2 голосов
/ 29 июня 2010

Для доступа к роли вам просто нужно указать, что конкретная роль для определенного URL имеет доступ к этому действию. Это если вы используете подход RequestMap плагина. Если вы используете подход аннотации, просто аннотируйте действие в контроллере с помощью:

@ Обеспеченные ([ 'WHATEVER_ROLE'])

Поскольку пользователь, создавший книгу, может ее редактировать, вы можете вывести домен пользователя из аутентификации с помощью authenticateService.userDomain (), а затем сравнить этого пользователя с пользователем, создавшим книгу (при условии, что у вас есть какое-то свойство madeBy на вашем домене Book.

def loggedInUser = authenticateService.userDomain()
if (book.createdBy.equals(loggedInUser)) {
   // allow editing
}

Как-то так.

...