Я занимаюсь разработкой веб-приложения Grails (версия 1.3.3) с использованием подключаемого модуля Grails Spring-Security Spring-Security-Core-1.0.1 (который, в свою очередь, использует spring-security-3.0.2). RELEASE).
Я хотел бы предоставить управление доступом на основе аннотаций Spring-Security для действий внутри контроллера.
Мне удалось успешно выполнить базовую аутентификацию, используя следующие аннотации:
@Secured("hasAnyRole('ROLE_USER')")
def list = {
...
}
Это работает - предоставление доступа к действию / представлению list только тем, у кого есть роль ROLE_USER.
Однако набор ролей, которым разрешено выполнять определенные действия контроллера, может со временем меняться и является функцией общего состояния системы. Таким образом, набор ролей, которым разрешено выполнять данное действие, может быть возвращен методом службы или объекта домена.
Один из способов, которым я мог бы сделать что-то подобное, это использовать «Контроль доступа на основе выражений» Spring-Security (аннотации @Pre и @Post), что-то вроде примера в Документация по безопасности Spring :
@PreAuthorize("hasPermission(#contact, 'admin')")
public void deletePermission(Contact contact, Sid recipient, Permission permission);
В этом примере для принятия решений об управлении доступом можно получить доступ к объектам, отправленным методу (например, контакту), используя синтаксис #contact.
Однако я не могу получить аннотации @PreAuthorize (или @RolesAllowed) для работы с контроллером Grails. Если я аннотирую действие list с помощью @PreAuthorize (вместо @Secured, как указано выше), я получаю следующую ошибку:
Примечание
@ org.springframework.security.access.prepost.PreAuthorize
не допускается для элемента FIELD
Это не удивительно - действие - это Groovy-замыкание (поле с исполняемым кодом), а не метод. Однако я также попытался использовать аннотацию для методов, вызываемых из замыкания, например:
def list = {
testMethod()
....
}
@PreAuthorize("hasRole('ROLE_USER')")
public boolean testMethod(){
println "testMethod succeess"
return true;
}
Хотя это не приводит к ошибкам, оно также не обеспечивает контроля доступа. («testMethod success» выводится независимо от того, есть ли у пользователя ROLE_USER).
Итак, я попробовал несколько разных вещей (и прочитал документацию), но не смог выработать хороший способ использования аннотаций @PreAuthorize с действием контроллера Grails. Это возможно? Есть ли лучший способ в приложении Grails использовать Spring-Security-Annotations для обеспечения контроля доступа, который зависит от состояния системы?