1. Обзор
В этом кратком руководстве мы рассмотрим, как защитить веб-приложение Jakarta EE с помощью Spring Security .
2. Зависимости Maven
Давайте начнем с необходимых зависимостей безопасности Spring для этого урока :
org.springframework.security spring-security-web 4.2.3.RELEASE org.springframework.security spring-security-config 4.2.3.RELEASE org.springframework.security spring-security-taglibs 4.2.3.RELEASE
Последняя версия Spring Security (на момент написания этого руководства) – 4.2.3.RELEASE; как всегда, мы можем проверить Maven Central на наличие новейших версий.
3. Конфигурация безопасности
Затем нам нужно настроить конфигурацию безопасности для существующего приложения Jakarta EE:
@Configuration @EnableWebSecurity public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password("user1Pass").roles("USER") .and() .withUser("admin").password("adminPass").roles("ADMIN"); } }
В методе configure() мы настраиваем Диспетчер аутентификации|/. Для простоты мы реализуем простую аутентификацию в памяти. Данные пользователя жестко закодированы.
Это предназначено для быстрого прототипирования, когда нет необходимости в полном механизме сохранения.
Далее, давайте интегрируем безопасность в существующую систему, добавив класс SecurityWebApplicationInitializer :
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { public SecurityWebApplicationInitializer() { super(SpringSecurityConfig.class); } }
Этот класс обеспечит загрузку конфигурации Spring Security во время запуска приложения. На данном этапе мы достигли базовой реализации Spring Security . При такой реализации Spring Security по умолчанию потребует проверки подлинности для всех запросов и маршрутов.
4. Настройка Правил Безопасности
Мы можем дополнительно настроить безопасность Spring, переопределив WebSecurityConfigurerAdapter ‘s configure(HttpSecurity http) метод:
@Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/auth/login*").anonymous() .anyRequest().authenticated() .and() .formLogin() .loginPage("/auth/login") .defaultSuccessUrl("/home", true) .failureUrl("/auth/login?error=true") .and() .logout().logoutSuccessUrl("/auth/login"); }
Используя метод antMatchers () , мы настраиваем Spring Security, чтобы разрешить анонимный доступ к /auth/login и аутентифицировать любой другой запрос.
4.1. Пользовательская страница Входа в систему
Пользовательская страница входа в систему настраивается с помощью метода form Login() :
http.formLogin() .loginPage("/auth/login")
Если это не указано, Spring Security создает страницу входа по умолчанию в /login :
Login
4.2. Пользовательская Целевая страница
После успешного входа в систему Spring Security перенаправляет пользователя в корневой каталог приложения. Мы можем переопределить это, указав URL-адрес успеха по умолчанию:
http.formLogin() .defaultSuccessUrl("/home", true)
Установив для параметра defaultSuccessUrl() метода always Use значение true, пользователь всегда будет перенаправлен на указанную страницу.
Если параметр всегда использовать не установлен или имеет значение false, пользователь будет перенаправлен на предыдущую страницу, к которой он пытался получить доступ, прежде чем ему будет предложено пройти аутентификацию.
Аналогично, мы также можем указать пользовательскую целевую страницу сбоя:
http.formLogin() .failureUrl("/auth/login?error=true")
4.3. Авторизация
Мы можем ограничить доступ к ресурсу по ролям:
http.formLogin() .antMatchers("/home/admin*").hasRole("ADMIN")
Пользователь, не являющийся администратором, получит сообщение об ошибке отказа в доступе, если он попытается получить доступ к конечной точке/ home/admin/|.
Мы также можем ограничить данные на странице JSP в зависимости от роли пользователя. Это делается с помощью тега :
Чтобы использовать этот тег, мы должны включить теги безопасности Spring taglib в верхней части страницы:
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
5. Конфигурация XML безопасности Spring
До сих пор мы рассматривали настройку Spring Security в Java. Давайте рассмотрим эквивалентную конфигурацию XML.
Во-первых, нам нужно создать security.xml файл в папке web/WEB-INF/spring , содержащей ваши конфигурации XML. Пример такого security.xml файл конфигурации доступен в конце статьи.
Давайте начнем с настройки диспетчера проверки подлинности и поставщика проверки подлинности. Для простоты мы используем простые жестко закодированные учетные данные пользователя:
То, что мы только что сделали, – это создали пользователя с именем пользователя, паролем и ролью.
Кроме того, мы можем настроить поставщика аутентификации с помощью кодера паролей:
Мы также можем указать пользовательскую реализацию Spring UserDetailsService или Источник данных в качестве поставщика аутентификации. Более подробную информацию можно найти здесь.
Теперь, когда мы настроили диспетчер аутентификации, давайте настроим правила безопасности и применим контроль доступа:
В приведенном выше фрагменте мы настроили HttpSecurity для использования входа в форму и установили /secure.jsp в качестве URL-адреса успешного входа в систему. Мы предоставили анонимный доступ к /index.jsp и пути “/” . Кроме того, мы указали, что доступ к /secure.jsp должен требовать аутентификации, а аутентифицированный пользователь должен иметь, по крайней мере, уровень полномочий ROLE_USER .
Установка атрибута auto-config тега http в значение true предписывает Spring Security реализовать поведение по умолчанию, которое нам не нужно переопределять в конфигурации. Поэтому /login и /logout будут использоваться для входа пользователя и выхода из системы соответственно. Также предоставляется страница входа по умолчанию.
Мы можем дополнительно настроить тег form-login с помощью пользовательских страниц входа и выхода, URL-адресов для обработки как сбоя аутентификации, так и успеха. В приложении Пространство имен безопасности перечислены все возможные атрибуты для тегов form-login (и других). Некоторые идеи также делают возможным проверку, щелкая по тегу при нажатии клавиши ctrl .
Наконец, для security.xml config, который будет загружен во время запуска приложения, нам нужно добавить следующие определения в наш web.xml :
contextConfigLocation /WEB-INF/spring/*.xml springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /* org.springframework.web.context.ContextLoaderListener
Обратите внимание, что попытка использовать конфигурации на основе XML и Java в одном приложении JEE может привести к ошибкам.
6. Заключение
В этой статье мы рассмотрели, как защитить приложение Jakarta EE с помощью Spring Security, и продемонстрировали конфигурации на основе Java и XML.
Мы также обсудили способы предоставления или отзыва доступа к определенным ресурсам в зависимости от роли пользователя.
Полный исходный код и определения XML доступны на GitHub .