Использование До / после аннотации Spring-Security с Grails

Я разрабатываю веб-приложение 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 для обеспечения контроля доступа, который является функцией состояния системы?

7
задан cweston 4 February 2016 в 20:17
поделиться

1 ответ

Вам необходимо использовать плагин ACL , чтобы использовать эти аннотации, но они не будут работать с действиями контроллера по указанным вами причинам. @Secured работает, потому что я создал копию аннотации Spring Security, которая позволяет размещать ее в полях, а также в методах и классах, и я ищу их и явно подключаю. Вам нужно будет использовать аннотированные службы, которые вы вызываете из своих контроллеров.

5
ответ дан 7 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: