Перейти к основному содержимому

Базовая аутентификация Spring Security

· 4 мин. чтения

1. Обзор

В этом руководстве объясняется, как установить, настроить и настроить базовую аутентификацию с помощью Spring . Мы собираемся использовать простой пример Spring MVC и защитить пользовательский интерфейс приложения MVC с помощью механизма Basic Auth, предоставляемого Spring Security.

2. Конфигурация безопасности Spring

Мы можем настроить Spring Security с помощью конфигурации Java:

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

@Autowired
private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password(passwordEncoder().encode("user1Pass"))
.authorities("ROLE_USER");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/securityNone").permitAll()
.anyRequest().authenticated()
.and()
.httpBasic()
.authenticationEntryPoint(authenticationEntryPoint);

http.addFilterAfter(new CustomFilter(),
BasicAuthenticationFilter.class);
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}

Здесь мы используем элемент httpBasic() для определения базовой аутентификации внутри метода configure() класса, который расширяет WebSecurityConfigurerAdapter.

Мы могли бы добиться того же результата, используя XML:

<http pattern="/securityNone" security="none"/>
<http use-expressions="true">
<intercept-url pattern="/**" access="isAuthenticated()" />
<http-basic />
</http>

<authentication-manager>
<authentication-provider>
<user-service>
<user name="user1" password="{noop}user1Pass" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>

Здесь важен элемент <http-basic> внутри основного элемента <http> конфигурации. Этого достаточно, чтобы включить обычную аутентификацию для всего приложения. Поскольку в этом руководстве мы не будем фокусироваться на диспетчере аутентификации, мы будем использовать диспетчер в памяти с пользователем и паролем, определенными в виде обычного текста.

Web.xml веб -приложения, обеспечивающего Spring Security, уже обсуждался в учебнике Spring Logout .

3. Использование защищенного приложения

Команда curl — это наш инструмент для использования защищенного приложения.

Во-первых, давайте попробуем запросить /homepage.html без предоставления каких-либо учетных данных безопасности:

curl -i http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

Возвращаем ожидаемый 401 Unauthorized и Authentication Challenge :

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 1061
Date: Wed, 29 May 2013 15:14:08 GMT

Обычно браузер интерпретирует этот вызов и запрашивает учетные данные в простом диалоговом окне, но, поскольку мы используем curl , это не так.

Теперь давайте запросим тот же ресурс, домашнюю страницу, но также предоставим учетные данные для доступа к ней:

curl -i --user user1:user1Pass 
http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

В результате от сервера приходит ответ 200 OK вместе с Cookie :

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 90
Date: Wed, 29 May 2013 15:19:38 GMT

Из браузера мы можем нормально использовать приложение; единственное отличие состоит в том, что страница входа в систему больше не является жестким требованием, поскольку все браузеры поддерживают обычную аутентификацию и используют диалоговое окно для запроса учетных данных пользователя.

4. Дальнейшая настройка – точка входа

По умолчанию BasicAuthenticationEntryPoint , предоставленный Spring Security, возвращает клиенту полную страницу для ответа 401 Unauthorized . Это HTML-представление ошибки хорошо отображается в браузере. И наоборот, он не очень подходит для других сценариев, таких как REST API, где может быть предпочтительным представление json.

Пространство имен также является достаточно гибким для этого нового требования. Чтобы решить эту проблему, точку входа можно переопределить:

<http-basic entry-point-ref="myBasicAuthenticationEntryPoint" />

Новая точка входа определяется как стандартный bean-компонент:

@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {

@Override
public void commence(
HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
throws IOException, ServletException {
response.addHeader("WWW-Authenticate", "Basic realm="" + getRealmName() + """);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
PrintWriter writer = response.getWriter();
writer.println("HTTP Status 401 - " + authEx.getMessage());
}

@Override
public void afterPropertiesSet() throws Exception {
setRealmName("ForEach");
super.afterPropertiesSet();
}
}

Записывая непосредственно в HTTP-ответ, мы теперь имеем полный контроль над форматом тела ответа.

5. Зависимости Maven

Зависимости Maven для Spring Security обсуждались ранее в статье Spring Security with Maven . Нам понадобятся как spring-security-web, так и spring-security-config , доступные во время выполнения.

6. Заключение

В этой статье мы защитили приложение MVC с помощью Spring Security и Basic Authentication. Мы обсудили конфигурацию XML и использовали приложение с помощью простых команд curl. Наконец, мы взяли под контроль точный формат сообщений об ошибках, перейдя от стандартной HTML-страницы ошибок к пользовательскому тексту или формату JSON.

Полную реализацию этой статьи можно найти в проекте GitHub . Это проект на основе Maven, поэтому его легко импортировать и запускать как есть.

Когда проект выполняется локально, доступ к образцу HTML можно получить по адресу:

http://localhost:8080/spring-security-rest-basic-auth/api/foos/1 .