Я разрабатываю веб-приложение 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 = {
...
}
Это работает - предоставление доступа к действию / представлению списка только тем, кто обладает ролью ROLE_USER.
Однако набор ролей, которым разрешено выполнять определенные действия контроллера, может изменяться со временем и является функцией общего состояния системы. То есть набор ролей, которым разрешено выполнять данное действие, может быть возвращен методом службы или объекта домена.
Один из способов, с помощью которого я мог бы сделать что-то подобное, - это использовать доступ на основе выражений Spring-Security. Control »(аннотации @Pre и @Post), что-то вроде примера в Spring Security Documentation :
@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 для обеспечения контроля доступа, который является функцией состояния системы?
Вам необходимо использовать плагин ACL , чтобы использовать эти аннотации, но они не будут работать с действиями контроллера по указанным вами причинам. @Secured работает, потому что я создал копию аннотации Spring Security, которая позволяет размещать ее в полях, а также в методах и классах, и я ищу их и явно подключаю. Вам нужно будет использовать аннотированные службы, которые вы вызываете из своих контроллеров.