Использование Широ для защиты сервисов в граалях

Я использую grails для создания приложения, которое функционирует в основном как сервисная структура. У меня вопрос: можно ли защитить службы так же, как контроллеры?

Пример на основе uri:

class SecurityFilters {
  def filters = {
    all(uri: "/**") {
      before = {
        // Ignore direct views (e.g. the default main index page).
        if (!controllerName) return true
        // Access control by convention. 
        accessControl()
      }
    } 
  } 
}

person Brandon    schedule 03.02.2010    source источник


Ответы (1)


Понятия не имею, поддерживает ли это подключаемый модуль Shiro, но подключаемый модуль Acegi < / a> работает, хотя и «экспериментальным» способом (что бы это ни значило).

Обновить

Внимательно прочитав вопрос, кажется, вы спрашиваете, можете ли вы использовать фильтры для защиты служб. Если это так, то Широ не имеет значения, потому что авторизацию выполняют фильтры, а не Широ.

Итак, чтобы ответить на ваш вопрос о том, можете ли вы использовать фильтры для защиты служб, ответ будет отрицательным, потому что у вас есть доступ к контроллеру только из фильтра. Однако вы можете использовать метапрограммирование Groovy для перехвата методов в стиле АОП на сервисах.

Базовый подход:

  • Для каждой службы добавьте свойство invokeMethod в MetaClass
  • Значением этого свойства должно быть Closure. Это закрытие будет перехватывать (т.е. вызываться вместо) каждый метод, вызываемый в службе.
  • This closure should
    • Perform the security checks
    • Вызвать исходный метод, если авторизация прошла успешно, и выбросить исключение (или показать ошибку), если авторизация не удалась.

В сторону

Если это вообще возможно, я настоятельно рекомендую использовать проверенный плагин безопасности (например, Shiro, Acegi) для выполнения проверок авторизации, а не накатывать свой собственный, как описано выше.

person Dónal    schedule 03.02.2010
comment
Спасибо. Я использую сиро, а не ацеги. Я хотел бы воспользоваться фильтрацией для защиты услуг. Извините, если это было непонятно. - person Brandon; 03.02.2010
comment
Спасибо за фантастический совет. - person Brandon; 26.02.2010