Использование аннотаций Pre / Post Spring-Security с Grails - PullRequest
7 голосов
/ 18 августа 2010

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

1 Ответ

5 голосов
/ 18 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...