Статьи

Грааль с Spring Security

1. Обзор интеграции Spring Security с Grails

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

Учитывая это, из-за использования Grails Spring Inversion of Control Framework и установки MVC разработчики стремились использовать Spring Security для защиты Grails.

Это привело к появлению двух заметных плагинов: Spring Security Core Plugin и Spring Security ACL Plugin .

Мы рассмотрим возможности этих плагинов Spring Security и проведем сравнение с использованием Spring Security для простого старого приложения Spring.

2. Spring Security Core Plugin

Этот плагин предоставляет практические значения по умолчанию со многими опциями конфигурации для настройки.

2.1 Доменные классы

Плагин Spring Security Core использует классы домена Grails по умолчанию. Чтобы использовать стандартный поиск для плагина, нам нужен, как минимум, класс домена Person и Authority .

Если мы хотим сохранить сопоставления ролей URL <==> в базе данных (что является одним из нескольких подходов для определения сопоставлений), нам нужен класс домена Requestmap . Если мы используем рекомендуемый подход для отображения отношения «многие ко многим» между Person и Authority, нам также необходим класс домена для сопоставления таблицы соединений.

Чтобы использовать поиск пользователя / группы, нам также потребуется класс группового домена. Если мы используем рекомендуемый подход для отображения отношений «многие ко многим» между Person и Group, а также между Group и Authority, нам потребуется класс домена для каждого из них, чтобы отобразить таблицы объединения. Мы все еще можем дополнительно использовать Requestmap с этим подходом.

Мы можем использовать s2-quickstart для генерации классов домена. Синтаксис довольно прост:

1
grails s2-quickstart DOMAIN_CLASS_PACKAGE USER_CLASS_NAME ROLE_CLASS_NAME [REQUESTMAP_CLASS_NAME] [--groupClassName=GROUP_CLASS_NAME]

Пример с Person , Authority и Requestmap :

1
grails s2-quickstart com.ourapp Person Authority Requestmap

2.2 Настройка сопоставления запросов для защиты URL-адресов

Мы можем выбрать один из следующих подходов для настройки сопоставления запросов для защиты URL-адресов:

Мы можем использовать только один метод за раз.

Например, здесь используется аннотация @Secured с Spring Expression Language (SpEL):

1
2
3
4
5
6
class SecureController {
 
   @Secured("hasRole('ROLE_USER')")
   def someRandomAction() {
      ...
   }

2.3 Различные другие функции

Некоторые различные функции плагина Spring Security Core включают в себя:

  • Вспомогательные классы для работы с более низкими уровнями Spring Security, такими как SecurityTagLib, который предоставляет теги GSP для поддержки условного отображения на основе того, аутентифицирован ли пользователь и / или имеет ли он необходимую роль для выполнения определенного действия.
  • События — включая уведомления о событиях, прослушиватели событий и замыкания обратного вызова.
  • Фильтры, включая возможность определить, какие фильтры применяются к различным шаблонам URL.

3. Плагин Spring Security ACL

Плагин Spring Security ACL добавляет поддержку безопасности доменных объектов в приложение Grails, которое использует вышеупомянутый плагин Spring Security Core. Итак, нам нужно иметь этот другой плагин уже в нашем build.gradle .

Что значит добавить поддержку Domain Object Security? Плагин Spring Security Core и другие плагины расширения поддерживают ограничение доступа к URL-адресам с помощью правил, которые включают проверку статуса аутентификации пользователя, ролей и т. Д., А плагин ACL расширяет это, добавляя поддержку ограничения доступа к отдельным экземплярам класса домена.

3.1 Метод безопасности

Четыре аннотации, обычно доступные в Spring Security, доступны для использования с выражениями Spring Expression Language (SpEL) для выполнения контроля доступа на основе выражений :

  • @PreAuthorize
  • @PreFilter
  • @PostAuthorize
  • @PostFilter

Все приведенные выше аннотации описаны в разделе « Выражения безопасности метода» документации Spring Security.

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

К счастью, помимо различий в синтаксисе между Groovy и Java, код действительно выглядит одинаково:

1
2
3
4
5
6
@PreAuthorize("hasRole('ROLE_USER')")
   @PostFilter("hasPermission(filterObject, read) or " +
               "hasPermission(filterObject, admin)")
   List getAllDocs(params = [:]) {
      Report.list(params)
   }

3.2 Доменные классы

Как и плагин Spring Security Core, плагин Spring Security ACL использует доменные классы для соответствующей структуризации.

Классы домена в этом случае используются для управления состоянием базы данных. Чтобы быть совместимым с типичным кодом JDBC Spring Security, создаются доменные классы для генерации имен таблиц и столбцов.

Классы в этом плагине, связанные с постоянством, используют эти классы. Однако их можно переопределить, запустив сценарий s2-create-acl-domains :

1
grails s2-create-acl-domains

Таким образом, скрипт будет генерировать те же классы grails-app/domain папке нашего приложения grails-app/domain чтобы обеспечить некоторую настройку.

3.3 Различные другие функции

Некоторые различные функции плагина Spring Security ACL включают в себя:

  • Замена проверки подлинности при запуске: это временный переключатель проверки подлинности, который длится только один вызов метода.
  • Пользовательские разрешения. Для класса BasePermission доступно 5 разрешений: READ , WRITE , CREATE , DELETE и ADMINISTRATION . Вы можете добавить свои собственные разрешения, если вам нужно.
  • Библиотека тегов (taglib) для разрешения и отказа.

4. Вывод

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

Рекомендуемое чтение: авторизация ресурсов, основанных на том, кто их создал (Spring Security) и мои посты о Spring Framework для общих знаний о Spring.

Опубликовано на Java Code Geeks с разрешения Майкла Гуда, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Grails с Spring Security

Мнения, высказанные участниками Java Code Geeks, являются их собственными.