1. Введение
В этой статье речь пойдет о входе в систему с помощью Spring Security . Мы собираемся построить поверх простого предыдущего примера Spring MVC , так как это необходимая часть настройки веб-приложения вместе с механизмом входа в систему.
2. Maven Зависимости
Чтобы добавить зависимости Maven в проект, см. Статью Spring Security with Maven . Потребуются как стандартные spring-security-web, так и spring-security-config .
3. Веб.xml
Конфигурация Spring Security в web.xml проста — в стандартный Spring MVC web.xml добавлен только дополнительный фильтр:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation=" id = "WebApp_ID" version = "3.0" > < display-name >Spring Secured Application</ display-name > <!-- Spring MVC --> < servlet > < servlet-name >mvc</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >mvc</ servlet-name > < url-pattern >/</ url-pattern > </ servlet-mapping > < context-param > < param-name >contextClass</ param-name > < param-value > org.springframework.web.context.support.AnnotationConfigWebApplicationContext </ param-value > </ context-param > < context-param > < param-name >contextConfigLocation</ param-name > < param-value >org.baeldung.spring.web.config</ param-value > </ context-param > < listener > < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener > <!-- Spring Security --> < filter > < filter-name >springSecurityFilterChain</ filter-name > < filter-class >org.springframework.web.filter.DelegatingFilterProxy</ filter-class > </ filter > < filter-mapping > < filter-name >springSecurityFilterChain</ filter-name > < url-pattern >/*</ url-pattern > </ filter-mapping > </ web-app > |
Фильтр DelegatingFilterProxy просто делегирует управляемый bean-компонент Spring — FilterChainProxy, который сам может извлечь выгоду из полного управления жизненным циклом bean-компонента Spring и тому подобного.
2. Конфигурация Spring Security
Конфигурация Spring в основном написана на Java, но конфигурация Spring Security еще не поддерживает полную Java и по большей части должна быть XML. В настоящее время предпринимаются попытки добавить конфигурацию на основе Java для Spring Security , но она еще не разработана.
В общем проекте используется конфигурация Java, поэтому файл конфигурации XML необходимо импортировать через класс Java @Configuration :
1
2
3
4
5
6
7
|
@Configuration @ImportResource ({ "classpath:webSecurityConfig.xml" }) public class SecSecurityConfig { public SecSecurityConfig() { super (); } } |
Конфигурация Spring Security XML — webSecurityConfig.xml :
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation=" < http use-expressions = "true" > < intercept-url pattern = "/login*" access = "isAnonymous()" /> < intercept-url pattern = "/**" access = "isAuthenticated()" /> < form-login login-page = '/login.html' default-target-url = "/homepage.html" authentication-failure-url = "/login.html?error=true" /> < logout logout-success-url = "/login.html" /> </ http > < authentication-manager > < authentication-provider > < user-service > < user name = "user1" password = "user1Pass" authorities = "ROLE_USER" /> </ user-service > </ authentication-provider > </ authentication-manager > </ beans:beans > |
2.1. <перехватывать-url>
Мы разрешаем анонимный доступ при входе в систему, чтобы пользователи могли проходить аутентификацию. Мы также обеспечиваем все остальное.
Обратите внимание, что порядок элемента <intercept-url> является существенным — более конкретные правила должны стоять первыми, а затем более общие.
2.2. <форма-Логин>
- страница входа — пользовательская страница входа
- default-target-url — целевая страница после успешного входа
- authentication-fail-url — целевая страница после неудачного входа
2,3. <аутентификация менеджер>
Поставщик аутентификации поддерживается простой реализацией в памяти, в частности InMemoryUserDetailsManager, сконфигурированной в виде простого текста. Это существует только в Spring 3.1 и выше и предназначено для быстрого прототипирования, когда механизм полного сохранения еще не нужен.
3. Форма входа
Страница формы входа будет зарегистрирована в Spring MVC с использованием простого механизма для сопоставления имен представлений с URL-адресами без необходимости наличия явного контроллера между ними:
1
|
registry.addViewController( "/login.html" ); |
Это, конечно, соответствует login.jsp :
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
< html > < head ></ head > < body > < h1 >Login</ h1 > < form name = 'f' action = "j_spring_security_check" method = 'POST' > < table > < tr > < td >User:</ td > < td >< input type = 'text' name = 'j_username' value = '' ></ td > </ tr > < tr > < td >Password:</ td > < td >< input type = 'password' name = 'j_password' /></ td > </ tr > < tr > < td >< input name = "submit" type = "submit" value = "submit" /></ td > </ tr > </ table > </ form > </ body > </ html > |
Форма входа в Spring содержит следующие соответствующие артефакты:
- j_spring_security_check — URL-адрес, где форма POST помещена для запуска процесса аутентификации
- j_username — имя пользователя
- j_password — пароль
4. Дальнейшая настройка Spring Login
Мы кратко обсудили несколько конфигураций механизма входа в систему, когда мы представили конфигурацию Spring Security XML выше, — давайте теперь рассмотрим некоторые детали.
Одной из причин переопределения большинства настроек по умолчанию в Spring Security является скрытие того факта, что приложение защищено Spring Security, и минимизация информации, которую потенциальный злоумышленник знает о приложении.
Полностью настроенный элемент <form-login> выглядит следующим образом:
1
2
3
4
5
6
|
< form-login login-page = '/login.html' login-processing-url = "/perform_login" default-target-url = "/homepage.html" authentication-failure-url = "/login.html?error=true" always-use-default-target = "true" /> |
4.1. Страница входа
Пользовательская страница входа настраивается с помощью атрибута страницы входа в систему <n-<form-login> :
1
|
login-page='/login.html' |
Если это не указано, используется URL по умолчанию — spring_security_login — и Spring Security сгенерирует очень простую форму для входа по этому URL.
4.2. POST URL для входа
URL-адрес по умолчанию, по которому Spring Login будет POST для запуска процесса аутентификации, является / j_spring_security_check .
Этот URL может быть переопределен с помощью атрибута login-processing-url в <form-login> :
1
|
login-processing-url="/perform_login" |
Хорошая причина переопределить этот URL-адрес по умолчанию — скрыть тот факт, что приложение действительно защищено Spring Security — эта информация не должна быть доступна извне.
4,3. Целевая страница на Успех
После успешного входа в систему пользователь перенаправляется на страницу, которая по умолчанию является корнем веб-приложения.
Это можно переопределить с помощью атрибута default-target-url в <form-login> :
1
|
default-target-url="/homepage.html" |
Если всегда задано значение true -target-default- true, пользователь всегда перенаправляется на эту страницу. Если для этого атрибута установлено значение false, пользователь будет перенаправлен на предыдущую страницу, которую он хотел посетить, прежде чем будет повышен до уровня аутентификации.
4.4. Целевая страница на отказ
Как и на странице входа в систему, страница сбоя входа автоматически генерируется Spring Security в / spring_security_login? Login_error по умолчанию.
Это можно переопределить с помощью атрибута authentication-fail-url в <form-login> :
1
|
authentication-failure-url="/login.html?error=true" |
5. Заключение
В этом примере входа в Spring мы настроили простой процесс аутентификации — мы обсудили форму входа в Spring Security, конфигурацию XML безопасности и некоторые из более сложных настроек, доступных в пространстве имен.
Реализация этого учебника Spring Login можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.
Когда проект выполняется локально, образец html может быть доступен по адресу: