Spring MVC и Spring Security. Пример настройки страницы логина, настройка ролей

Spring MVC и Spring Security. Настройка Spring Security, создание страницы логина, настройка ролей, ограничение доступа к частям приложения с помощью аннотаций или xml настроек. Обзор базовых security тегов на странице jsp.

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
  • Spring MVC 4.2.4.Release
  • Spring Security 4.0.4.Release
  • IntelliJ IDEA 15.0.2

1. Описание задачи

Подключить модуль Spring Security 4 к нашему приложению Spring MVC. Настроить начальную страницу login, добавить страницы для отображения информации о нарушении прав доступа. Создать конфигурационный файл настроек Spring Security. Настроить роли, проверку авторизации пользователя с помощью информации из базы данных, а так же добавить некоторые дополнительные возможности из Spring Security.

Возможно вам будут интересны статьи из раздела Spring Security.

2. Структура проекта

mvcSecurityStructure

В проекте используется один Java класс-контроллер (SecurityController), с помощью которого обрабатываются запросы пользователя. Созданы несколько jsp представлений (login, admin, profile, security) с разными уровнями доступа. В случае недостаточных прав, пользователь будет перенаправлен на одну из страниц ошибки (пакет error).

3. pom.xml

Для использования возможностей Spring Security нам необходимо подключить несколько зависимостей этого модуля в проект.

Первые три зависимости относятся напрямую к модулю Spring Security. С помощью подключения этих зависимостей вы получаете возможность использования проверки безопасности в веб проекте, использовать пространство имен spring security и jsp тэгов прямо внутри страницы представления. Так же в проект была добавлена зависимость спецификации jsr-250. Она была добавлена для использования в контроллере аннотации @RolesAllowed и сравнении с аннотациями из Spring.

Полный файл pom.xml:

4. Файл конфигурации Spring Security

После добавления зависимостей для Spring Security нам необходимо настроить конфигурационный файл приложения. Принято выносить настройки безопасности в отдельный xml файл (или класс, если используете аннотации). Был создан файл security-context.xml рядом с остальными файлами конфигурации спринг. Это можно было сделать автоматически нажав правой кнопкой на проект > Add Framework Support.. и выбрав там Spring Security (возможно у вас был добавлен весь проект Spring и тогда выбор будет не доступен). В любой случае всё что нужно это создать этот xml файл и проверить, что он добавлен в контекст нашего приложения.

security Project Structure

Перед тем как перейти к настройкам безопасности, в mvc-config.xml была добавлена одна строчка (а так же пространство имен spring-security.xsd) для того, чтобы заработали аннотации Spring Security в Java классах.

mvc-config.xml:

  • security: — пространство имен Spring Security, которое задается вначале файла.
  • global-method-security — предоставляет методы безопасности для всех бинов, зарегистрированных в контексте Spring приложения. В частности, бины будут проверяться на наличие совпадений с упорядоченным списком дочерних элементов protect-pointcut и\или аннотаций Spring Security. Подробнее в документации или в справке IDEA (ctrl+q).
  • secured-annotations, jsr250-annotations — включение аннотаций из соответствующих библиотек.

Наконец перейдем к главному файлу настроек безопасности Spring Security для нашего приложения.

security-config.xml:

После определения пространства имен в тэге <http> </http> указываются атрибуты auto-config и use-expressions. Первый позволяет создать форму авторизации по умолчанию, второй атрибут позволяет использовать выражения (например hasRole(‘ADMIN’)).

<intercept-url> задает паттерн по которому будет проверяться уровень доступа клиента. Например <intercept-url pattern= «/user/**» access= «hasRole(‘USER’)»/> будет показывать страницу по адресу URL, содержащему /user/**, только пользователям с ролью USER. Пример: если попытаться войти без логина на страницу http://localhost:8080/user/,
то клиент будет переброшен на страницу, указанную в form-login login-page=’pageName.html’.

  • <form-login> задает различные настройки страницы авторизации (формы).
  • login-page — адрес страницы ввода логина и пароля. Если здесь ничего не указать, то Spring Security сгенерирует эту страницу самостоятельно.
  • username-parameter и password-parameter — параметры, которые используются для связывания с именем пользователя и паролем, которые были введены пользователем в форму. На странице login.jsp это выглядит так:

  • login-processing-url — задает значение action у form при котором Spring Security понимает, что нужно проверять пользователя согласно настройкам.
  • authentication-failure-url — URL, который будет сгенерирован в случае ошибки. Заметьте, что здесь мы передаем в качестве параметра с именем error значение true. Этот параметр проверяется на странице login.jsp.

  • <logout logout-url= ..> — параметр для выхода. Значение в этом атрибуте далее используется на странице представления (на кнопке выход). Например на странице admin.jsp:

  • remember-me — создает чекбокс «запомни меня». Далее указано время жизни. Запоминание происходит путем использования cookie с именем, указанным в key (у нас — myKey).
  • csrf — защита от этого типа атак. Подробнее в интернете.

Далее идет настройка проверки пользователей с помощью запроса к базе данных. Мы используем источник данных ‘dataSource‘, который задан в application-context.xml еще в части, где рассматривалась работа с БД (JDBC). Затем мы записываем в прямую запрос SQL, который будет выполнен для проверки пользователя. authentication-manager и authentication-provider можно настроить различными способами, здесь просто указывается алиас и сервис для проверки аутентификации (jdbc-user-service, описанный чуть выше).

5. Controller

В приложение написан один небольшой контроллер, который будет обрабатывать запросы с security.jsp. SecurityController:

@RolesAllowed — аннотация из стандарта JSR-250. Если пользователь обладает указанной ролью, то метод будет выполнен.

@PreAuthorize — аналогичная по назначению аннотация из Spring Security, в которой можно использовать выражения.

@Secured — еще один вариант проверки пользователя на обладание роли.

В случае попытки вызова этих методов пользователем без необходимых прав будет выброшено исключение org.springframework.security.access.AccessDeniedException: Access is denied.

6. Представления jsp

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

6.1. Header (менюшка сверху)

В header меню была добавлена проверка на авторизацию пользователя и ссылка на страницу авторизации. Напоминаю, что менюшка сверху прописана в файле-шаблоне template.tag.

securityIndex

Код выглядит так:

Вначале мы проверяем имеет ли пользователь одну из указанных ролей. Если нет (а так же параметр error пустой; напомню он прописывался в файле настроек security-config.xml и далее используется на нескольких jsp страницах), то выводится сообщение «Вы не вошли в приложение«. В противном случае используется запись ‘principal.username’, которая возвращает имя пользователя.

6.2 login.jsp (страница авторизации)

Если мы нажмем «Войти» (‘Login’) или попробуем зайти на страницу, где требуется определенная роль, то мы попадем на страницу авторизации login.jsp. Напомню, что она указывается в spring-config.xml как страница, на которую будут переброшены не авторизованные пользователи.

securityLogin

login.jsp:

Здесь стоит обратить внимание на использование значений атрибутов, которые были указаны в файле конфигурации Spring Security security-config.xml. Повторять описание не буду, а просто выделю их в отдельной записи:

6.3. Представление security.jsp для контроллера SecurityController

Для вышеописанного контроллера используется страница security.jsp.

С помощью нее можно перейти по защищенным ссылкам и посмотреть на результат работы Spring Security.

securityPage

  1. Будет вызван метод adminOrSuperUserCanCall()
  2. Будет вызван метод userOrAdminCanCall()
  3. Будет вызван метод adminMethodSecured()
  4. Будет совершен переход по ссылке /security/admin.html. Она удовлетворяет паттерну из файла конфигурации <intercept-url pattern = «/security/**» access= «hasRole(‘ADMIN’)» />. Таким образом, если пользователь не обладает ролью ADMIN, то его перекинет на страницу login.jsp.
6.4 error.jsp

На эту страницу будет попадать пользователь, если вызовет первые три метода из пункта выше, но при этом не будет удовлетворять условиям, которые проверяются перед вызовом метода.

securityError

error.jsp:

А если всё хорошо, то увидим другие надписи.

securityPageAccess

profile.jsp:

6.5 admin.jsp

Для авторизованного пользователя с ролью ADMIN страница будет выглядеть так.

securityAdmin

Без авторизации клиента перекинет на страницу авторизации. А в случае авторизованного пользователя, но с другой ролью (например USER) страница будет выглядеть так:

securityAdminFail

 

Примерно так можно начинать работать с Spring Security в приложении Spring MVC.

Исходные коды

MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.

15. Security — код для этой части

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Share Button
18
2124 Total Views 4 Views Today

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*