2010-06-29 2 views
2

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

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

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

Спасибо! Grzegorz

ответ

5

Вы должны использовать новый плагин 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 ядра используйте:

Hello <sec:username/>

(смотрите раздел "Безопасность Метки" из http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/)

+0

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

2

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

@Secured ([ «WHATEVER_ROLE»])

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

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

Что-то вроде этого, во всяком случае.

+0

Thans for response! Теперь проблема в том, где я могу поместить это получение текущего пользователя, чтобы я мог использовать данные этого пользователя повсюду. Например, я хотел бы видеть зарегистрированный вход пользователя в верхней части страницы независимо от того, какой контроллер предпринимает действия. Нужно ли определять его в каждом контроллере? – arnvald

Смежные вопросы