1. Введение
В этой статье речь пойдет об использованииSpring Security
Авторизоваться. Эта статья будет основываться на ранее простомВесенний пример MVCвыше, так как это необходимо для настройки веб-приложения и механизма входа в систему.
2. Зависимости Maven
Чтобы добавить зависимости Maven в свой проект, см.Spring Security with Mavenодна статья. стандартныйspring-security-web
иspring-security-config
необходимы.
3. Конфигурация Java безопасности Spring
Сначала мы создаем расширениеWebSecurityConfigurerAdapter
изSpring Security
Класс конфигурации. добавлением@EnableWebSecurity
, получаем поддержку интеграции Spring Security и MVC:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
.and()
.withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/anonymous*").anonymous()
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html", true)
//.failureUrl("/login.html?error=true")
.failureHandler(authenticationFailureHandler())
.and()
.logout()
.logoutUrl("/perform_logout")
.deleteCookies("JSESSIONID")
.logoutSuccessHandler(logoutSuccessHandler());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
В этом примере мы используем аутентификацию памяти и определяем 3 пользователей.
Теперь давайте посмотрим на элементы, которые мы использовали для создания конфигурации входа в форму.
3.1. authorizeRequests()
Мы разрешаем анонимный доступ к */login*, чтобы пользователи могли аутентифицироваться, а также для защиты других запросов. Обратите внимание, что порядок элементов *antMatchers()* имеет значение —Сначала вам нужно заполнить конкретные правила пути, а затем правила, которые примерно соответствуют.
3.2. formLogin()
Есть несколько способов настроить поведение входа в форму:
- loginPage()- Пользовательская страница входа
- loginProcessingUrl()- Отправить URL для имени пользователя и пароля
- defaultSuccessUrl()- URL-адрес перенаправляется после успешного входа в систему
- failureUrl()- URL-адрес перенаправляется после неудачного входа в систему
3.3. Authentication Manager
Поставщик аутентификации поддерживается простой реализацией в памяти —InMemoryUserDetailsManager. Это полезно для быстрого прототипирования, когда полный механизм сохраняемости еще не нужен.
Начиная с Spring 5, мы также должны определить кодировщик паролей.. В нашем примере мы использовалиBCryptPasswordEncoder.
4. Добавьте Spring Security в веб-приложение
Чтобы использовать конфигурацию Spring Security, определенную выше, нам нужно добавить ее в веб-приложение. В данном случае нам ничего не нужноweb.xml:
public class SpringApplicationInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[] {SecSecurityConfig.class};
}
}
Обратите внимание, что этот инициализатор не требуется, если мы используем приложение Spring Boot. Дополнительные сведения о том, как загрузить конфигурацию безопасности в Spring Boot, см.Spring Boot security auto-configuration
5. XML-конфигурация безопасности Spring
Давайте взглянем на соответствующую конфигурацию XML. Весь проект использует конфигурацию Java, поэтому нам нужно передать Java@Configuration
XML-файл конфигурации импорта класса:
@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
public SecSecurityConfig() {
super();
}
}
и XML-конфигурация Spring Security -webSecurityConfig.xml:
<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>
<password-encoder ref="encoder" />
</authentication-provider>
</authentication-manager>
<beans:bean id="encoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
</beans:bean>
6. web.xml
До введения Spring 4 мы использовалиweb.xml
Настройка Spring Security — добавляется только один дополнительный фильтрSpring MVC
веб.xml:
<display-name>Spring Secured Application</display-name>
<!-- Spring MVC -->
<!-- ... -->
<!-- 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>
Фильтр — DelegatingFilterProxy — просто делегирует управляемый bean-компонент Spring — FilterChainProxy — который сам может извлечь выгоду из полного управления жизненным циклом bean-компонента Spring.
7. Login Form
Страница формы входа использует простой механизмСопоставление имен представлений с URL-адресамиЗарегистрируйтесь в Spring MVC без написания контроллера:
registry.addViewController("/login.html");
соответствуетlogin.jsp:
<html>
<head></head>
<body>
<h1>Login</h1>
<form name='f' action="login" method='POST'>
<table>
<tr>
<td>User:</td>
<td><input type='text' name='username' value=''></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='password' /></td>
</tr>
<tr>
<td><input name="submit" type="submit" value="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
-
Spring Login formСодержит следующие связанные компоненты:
- login- Принять URL-адрес формы POST, запуская процесс аутентификации.
- username- имя пользователя
- password- пароль
8. Дальнейшая настройка входа в Spring
Когда мы прикрыли конфигурацию Spring Security выше, мы кратко обсудили конфигурацию некоторых механизмов входа в систему - теперь для более подробностей.
Одной из причин переопределения большинства значений по умолчанию в Spring Security являетсяСкрытое приложение защищено Spring Securityфакты и свести к минимуму знание приложения потенциальными злоумышленниками.
После полной настройки элемент входа выглядит следующим образом:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html",true)
.failureUrl("/login.html?error=true")
}
Или соответствующая конфигурация XML:
<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"/>
8.1. Страница входа
Далее давайте посмотрим, как настроить пользовательскую страницу входа с помощью метода *loginPage()*:
http.formLogin()
.loginPage("/login.html")
Или используйте конфигурацию XML:
login-page='/login.html'
Если мы не укажем это, Spring Security будет генерировать очень базовую форму входа в систему на * / login *.
8.2 URL-адрес POST для входа в систему
URL-адрес по умолчанию для запуска аутентификации */login*, мы можем использоватьloginProcessingUrlспособ переопределить этот URL:
http.formLogin()
.loginProcessingUrl("/perform_login")
В качестве альтернативы используйте конфигурацию XML:
login-processing-url="/perform_login"
Хорошая причина переопределить этот URL-адрес по умолчанию: чтобы скрыть приложениеSpring Security
Защищенные факты. Эта информация не должна предоставляться извне.
8.3 Страница успешного входа
После успешного входа в систему пользователь будет перенаправлен на страницу — по умолчанию эта страница является корневым каталогом веб-приложения.
Мы можем переопределить его с помощью метода *defaultSuccessUrl()*:
http.formLogin()
.defaultSuccessUrl("/homepage.html")
Или, используя конфигурацию XML:
default-target-url="/homepage.html"
еслиalways-use-default-targetУстановить какtrue
, пользователь всегда перенаправляется на эту страницу. Если это свойство установлено вfalse
, пользователь будет перенаправлен на предыдущую страницу, которую он хочет посетить, прежде чем ему будет предложено пройти аутентификацию.
8.4. Страница неудачного входа в систему
То же, что и страница входа, по умолчаниюSpring Security
Страница ошибки входа будет автоматически создана в */login?error*.
Чтобы переопределить его, мы можем использовать метод *failureUrl()*:
http.formLogin()
.failureUrl("/login.html?error=true")
или XML:
authentication-failure-url="/login.html?error=true"
9. Заключение
В этом примере Spring Login мы настроили простой процесс аутентификации — мы обсудили форму входа Spring Security, конфигурацию безопасности и некоторые из более сложных доступных настроек.
Реализацию этого учебника Spring Login можно найти по адресуGitHubНайдено в проекте — это проект на основе Eclipse, поэтому его легко импортировать и запускать.
Когда проект запускается локально, доступ к образцу HTML можно получить по адресу:
http://localhost:8080/spring-security-mvc-login/login.html
Добавить Автора
Переводчик: Лизен