Защита Java EE с помощью Spring Security
1. обзор
В этом кратком руководстве мы рассмотрим, какsecure a Java EE web application with Spring Security.
2. Maven Зависимости
Начнем с необходимогоSpring Security dependencies для этого урока:
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. Конфигурация безопасности
Далее нам нужно настроить конфигурацию безопасности для существующего приложения Java 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() мы устанавливаемAuthenticationManager. Для простоты мы реализуем простую аутентификацию в памяти. Данные пользователя жестко запрограммированы.
Это предназначено для быстрого прототипирования, когда нет необходимости в полном механизме персистентности.
Затем давайте интегрировать безопасность в существующую систему, добавив классSecurityWebApplicationInitializer:
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(SpringSecurityConfig.class);
}
}
Этот класс гарантирует, чтоSpringSecurityConfig загружается во время запуска приложения. На этом этапеwe’ve achieved a basic implementation of Spring Security. В этой реализации Spring Security по умолчанию будет требовать аутентификацию для всех запросов и маршрутов.
4. Настройка правил безопасности
Мы можем дополнительно настроить Spring Security, переопределив методWebSecurityConfigurerAdapter'sconfigure(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. Пользовательская страница входа
Пользовательская страница входа настраивается с помощью методаformLogin():
http.formLogin()
.loginPage("/auth/login")
Если это не указано, Spring Security генерирует страницу входа по умолчанию в/login:
Login
4.2. Пользовательская целевая страница
После успешного входа в систему Spring Security перенаправляет пользователя в корень приложения. Мы можем переопределить это, указав URL успеха по умолчанию:
http.formLogin()
.defaultSuccessUrl("/home", true)
Если для параметраalwaysUse методаdefaultSuccessUrl() установлено значение true, пользователь всегда будет перенаправлен на указанную страницу.
Если параметрalwaysUse не установлен или имеет значение false, пользователь будет перенаправлен на предыдущую страницу, к которой он пытался получить доступ, прежде чем ему будет предложено пройти аутентификацию.
Точно так же мы можем также указать пользовательскую целевую страницу сбоя:
http.formLogin()
.failureUrl("/auth/login?error=true")
4.3. авторизация
Мы можем ограничить доступ к ресурсу по роли:
http.formLogin()
.antMatchers("/home/admin*").hasRole("ADMIN")
Пользователь без прав администратора получит сообщение об ошибке «Доступ запрещен», если он / она попытается получить доступ к конечной точке/home/admin.
Мы также можем ограничить данные на странице JSP в зависимости от роли пользователя. Это делается с помощью тега<security:authorize>:
Чтобы использовать этот тег, мы должны включить тег taglib Spring Security вверху страницы:
<%@ taglib prefix="security"
uri="http://www.springframework.org/security/tags" %>
5. Конфигурация Spring Security XML
До сих пор мы рассматривали настройку Spring Security в Java. Давайте посмотрим на эквивалентную конфигурацию XML.
Во-первых, нам нужно создать файлsecurity.xml в папкеweb/WEB-INF/spring, который содержит наши конфигурации XML. Пример такого конфигурационного файлаsecurity.xml доступен в конце статьи.
Начнем с настройки диспетчера аутентификации и поставщика аутентификации. Для простоты мы используем простые жестко запрограммированные учетные данные пользователя:
Мы только что создали пользователя с именем пользователя, паролем и ролью.
Кроме того, мы можем настроить нашего провайдера аутентификации с помощью кодировщика пароля:
Мы также можем указать пользовательскую реализацию SpringUserDetailsService илиDatasource в качестве нашего поставщика аутентификации. Более подробную информацию можно найтиhere.
Теперь, когда мы настроили диспетчер аутентификации, давайте настроим правила безопасности и применим контроль доступа:
В приведенном выше фрагменте мы настроилиHttpSecurity на использование формы входа в систему и установили/secure.jsp в качестве URL-адреса успешного входа в систему. Мы предоставили анонимный доступ к/index.jsp и пути“/”. Также мы указали, что доступ к/secure.jsp должен требовать аутентификации, а аутентифицированный пользователь должен иметь, по крайней мере, уровень полномочийROLE_USER.
Установка для атрибутаauto-config тегаhttp значенияtrue инструктирует Spring Security реализовать поведение по умолчанию, которое нам не нужно переопределять в конфигурации. Следовательно,/login и/logout будут использоваться для входа и выхода пользователя соответственно. Страница входа по умолчанию также предоставляется.
Мы можем дополнительно настроить тегform-login с настраиваемыми страницами входа и выхода, URL-адресами для обработки как неудачной, так и успешной аутентификации. Security Namespace appendix перечисляет все возможные атрибуты для теговform-login (и других). Некоторые IDE также делают возможной проверку, щелкая тег и удерживая нажатой клавишуctrl.
Наконец, чтобы конфигурацияsecurity.xml загружалась во время запуска приложения, нам нужно добавить следующие определения в нашweb.xml:
contextConfigLocation
/WEB-INF/spring/*.xml
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
org.springframework.web.context.ContextLoaderListener
Обратите внимание, что попытка использовать конфигурации на основе XML и Java в одном приложении JEE может привести к ошибкам.
6. Заключение
В этой статье мы увидели, как защитить приложение Java EE с помощью Spring Security, и продемонстрировали конфигурации как на основе Java, так и на основе XML.
Мы также обсудили способы предоставления или отмены доступа к определенным ресурсам в зависимости от роли пользователя.
Полный исходный код и определения XML доступныover on GitHub.