1. Обзор
В этом руководстве объясняется, как установить, настроить и настроить базовую аутентификацию с помощью Spring . Мы собираемся использовать простой пример Spring MVC и защитить пользовательский интерфейс приложения MVC с помощью механизма базовой аутентификации, предоставляемого Spring Security.
2. Конфигурация безопасности Spring
Мы можем настроить Spring Security, используя конфигурацию Java:
@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter {
@Autowired private RestAuthenticationEntryPoint authenticationEntryPoint;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.inMemoryAuthentication()
.withUser("user1")
.password(passwordEncoder().encode("user1Pass"))
.authorities("ROLE_USER");
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(expressionInterceptUrlRegistry ->
expressionInterceptUrlRegistry.requestMatchers("/securityNone").permitAll()
.anyRequest().authenticated())
.httpBasic(httpSecurityHttpBasicConfigurer -> httpSecurityHttpBasicConfigurer.authenticationEntryPoint(authenticationEntryPoint));
http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Здесь мы используем элемент httpBasic() для определения базовой аутентификации внутри bean-компонента SecurityFilterChain .
Мы могли бы добиться того же результата, используя 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.
3. Использование защищенного приложения
Команда curl — это наш основной инструмент для использования защищенного приложения.
Во-первых, давайте попробуем запросить /homepage.html без предоставления каких-либо учетных данных:
curl -i http://localhost:8080/spring-security-rest-basic-auth/api/foos/1
Мы получаем ожидаемую ошибку 401 Unauthorized и запрос аутентификации:
- 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 . Это HTML-представление ошибки хорошо отображается в браузере. И наоборот, он не очень подходит для других сценариев, таких как REST API, где представление json может оказаться предпочтительным.
Пространство имен также достаточно гибкое для этого нового требования. Чтобы решить эту проблему, точку входа можно переопределить:
<http-basic entry-point-ref="myBasicAuthenticationEntryPoint" />
Новая точка входа определяется как стандартный компонент:
@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("Baeldung");
super.afterPropertiesSet();
}
}
Записывая непосредственно в HTTP-ответ, мы теперь имеем полный контроль над форматом тела ответа.
5. Зависимости Maven
Зависимости Maven для Spring Security уже обсуждались ранее в статье Spring Security with Maven . Нам понадобятся как Spring-security-web , так и Spring-security-config , доступные во время выполнения.
6. Заключение
В этой статье мы защитили приложение MVC с помощью Spring Security и базовой аутентификации. Мы обсудили конфигурацию XML и использовали приложение с помощью простых команд Curl. Наконец, мы взяли под контроль точный формат сообщения об ошибке, перейдя от стандартной страницы ошибок HTML к пользовательскому текстовому формату или формату JSON.
Полную реализацию этой статьи можно найти в проекте GitHub . Это проект на основе Maven, поэтому его легко импортировать и запускать в таком виде.
Оригинал статьи: https://www.baeldung.com/spring-security-basic-authentication