Якщо Spring Security знаходиться в classpath, то вебдодатки за замовчуванням захищені. Spring Boot покладається на
стратегію узгодження вмісту Spring Security, щоб визначити, чи використовувати httpBasic
або formLogin
.
Також можна додати анотацію @EnableGlobalMethodSecurity
з бажаними налаштуваннями, щоб впровадити
засоби безпеки на рівні методів у вебдодаток.
UserDetailsService
за замовчуванням надається для
одного користувача. Ім'я користувача — user
, а пароль — випадковий і виводиться на рівні WARN при
запуску програми, як показано в наступному прикладі:
Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35 Це генерований password is for development use only. This generated password is for development use only. Your security configuration must be updated before running your application in production.
org.springframework.boot.autoconfigure.security
налаштована на реєстрацію повідомлень рівня
WARN
. В іншому випадку пароль за замовчуванням не виводиться.
Можна змінити ім'я користувача та
пароль, вказавши spring.security.user.name
та spring.security.user.password
.
Основні функції, які тобі доступні за замовчуванням у вебдодатку, такі:
Бін
UserDetailsService
(абоReactiveUserDetailsService
у разі застосування на WebFlux) зі сховищем у пам'яті та одним користувачем зі згенерованим паролем (властивості користувача див.SecurityProperties.User
).Вхід до системи за допомогою форм або захист за допомогою HTTP Basic (залежно від заголовка
Accept
у запиті) для всієї програми (включно з кінцевими точками актуатора, якщо актуатор знаходиться в classpath).DefaultAuthenticationEventPublisher
для публікації подій автентифікації.
Ти можеш передати інший AuthenticationEventPublisher
, додавши для нього бін.
Засоби безпеки для MVC
Конфігурація засобів безпеки за замовчуванням реалізована в
SecurityAutoConfiguration
та UserDetailsServiceAutoConfiguration
. SecurityAutoConfiguration
імпортує SpringBootWebSecurityConfiguration
для забезпечення веббезпеки, а UserDetailsServiceAutoConfiguration
конфігурує автентифікацію, що також є актуальним для не пов'язаних з вебдодатків. Щоб повністю відключити
стандартну конфігурацію засобів безпеки вебдодатка або об'єднати кілька компонентів Spring Security, таких як
клієнт та сервер ресурсів OAuth2, додай бін типу SecurityFilterChain
(при цьому конфігурація UserDetailsService
або засоби безпеки для Actuator не будуть відключені).
Щоб, крім іншого, відключити конфігурацію UserDetailsService
,
можна додати бін типу UserDetailsService
, AuthenticationProvider
або AuthenticationManager
.
Правила доступу можна перевизначати шляхом додавання біна користувача SecurityFilterChain
або
WebSecurityConfigurerAdapter
. Spring Boot передбачає допоміжні методи, які можна використовувати для
визначення правил доступу для кінцевих точок актуаторів і статичних ресурсів. EndpointRequest
можна
використовувати для створення RequestMatcher
, що ґрунтується на властивості management.endpoints.web.base-path
.
PathRequest
можна використовувати, щоб створити RequestMatcher
для ресурсів, що
знаходяться в місцях, які часто використовуються.
Безпека в WebFlux
Подобно додаткам Spring MVC
можна
захистити свої програми WebFlux, додавши залежність spring-boot-starter-security
. Конфігурація засобів
безпеки за замовчуванням реалізована в ReactiveSecurityAutoConfiguration
та UserDetailsServiceAutoConfiguration
.
ReactiveSecurityAutoConfiguration
імпортує WebFluxSecurityConfiguration
для забезпечення
веббезпеки, а UserDetailsServiceAutoConfiguration
конфігурує автентифікацію, що також є актуальним для
програм, не пов'язаних з веб. Щоб повністю відключити стандартну конфігурацію засобів безпеки вебдодатку, можна
додати бін типу WebFilterChainProxy
(при цьому конфігурація UserDetailsService
або засоби
безпеки для Actuator не відключаються).
Щоб також вимкнути конфігурацію UserDetailsService
,
можна додати бін типу ReactiveUserDetailsService
або ReactiveAuthenticationManager
.
Правила доступу та використання декількох компонентів Spring Security, такі як клієнт та сервер ресурсів OAuth 2,
можна налаштувати шляхом додавання кастомного біну SecurityWebFilterChain
. Spring Boot передбачає
допоміжні методи, які можна використовувати для визначення правил доступу для кінцевих точок актуаторів і статичних
ресурсів. EndpointRequest
можна використовувати для створення ServerWebExchangeMatcher
,
який базується на властивості management.endpoints.web.base-path
.
PathRequest
можна використовувати, щоб створити ServerWebExchangeMatcher
для ресурсів, що знаходяться в місцях, які
часто використовуються.
Наприклад, можна налаштувати конфігурацію засобів безпеки, додавши щось на зразок:
import org.springframework.boot.autoconfigure.security.reactive.PathRequest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;
import static org.springframework.security.config.Customizer.withDefaults;
@Configuration(proxyBeanMethods = false)
public class MyWebFluxSecurityConfiguration {
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange((exchange) -> {
exchange.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll();
exchange.pathMatchers("/foo", "/bar").authenticated();
});
http.formLogin(withDefaults());
return http.build();
}
}
import org.springframework.boot.autoconfigure.security.reactive.PathRequest
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.web.server.ServerHttpSecurity
import org.springframework.security.web.server.SecurityWebFilterChain
@Configuration(proxyBeanMethods = false)
class MyWebFluxSecurityConfiguration {
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
http.authorizeExchange { spec ->
spec.matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
spec.pathMatchers("/foo", "/bar").authenticated()
}
http.formLogin()
return http.build()
}
}
OAuth2
OAuth2 — це система авторизації, що широко використовується, яка підтримується Spring.
Клієнт
Якщо у твоєму classpath є spring-security-oauth2-client
,
можна скористатися деякими можливостями автоконфігурації для встановлення клієнтів OAuth2/Open ID Connect.
Ця конфігурація використовує властивості OAuth2ClientProperties
. Ці властивості застосовні як до
сервлетів, так і до реактивних програм.
Можна зареєструвати кілька клієнтів і постачальників OAuth2 під
префіксом spring.security.oauth2.client
, як показано в наступному приклад:
spring.security.oauth2.client.registration.my-client-1.client-id=abcd
spring.security.oauth2.client.registration.my-client-1.client-secret=password
spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-1.scope=user
spring.security.oauth2.client.registration.my-client-1.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization-code
spring.security.oauth2.client.registration.my-client-2.client-id=abcd
spring.security.oauth2.client.registration.my-client-2.client-secret=password
spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
spring.security.oauth2.client.registration.my-client-2.scope=email
spring.security.oauth2.client.registration.my-client-2.redirect-uri=https://my-redirect-uri.com
spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=https://my-auth-server/oauth/authorize
spring.security.oauth2.client.provider.my-oauth-provider.token-uri=https://my-auth-server/oauth/token
spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=https://my-auth-server/userinfo
spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=https://my-auth-server/token_keys
spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
security:
oauth2:
client:
registration:
my-client-1:
client-id: "abcd"
client-secret: "password"
client-name: "Client for user scope"
provider: "my-oauth-provider"
scope: "user"
redirect-uri: "https://my-redirect-uri.com"
client-authentication-method: "basic"
authorization-grant-type: "authorization-code"
my-client-2:
client-id: "abcd"
client-secret: "password"
client-name: "Client for email scope"
provider: "my-oauth-provider"
scope: "email"
redirect-uri: "https://my-redirect-uri.com"
client-authentication-method: "basic"
authorization-grant-type: "authorization_code"
provider:
my-oauth-provider:
authorization-uri: "https://my-auth-server/oauth/authorize"
token-uri: "https://my-auth-server/oauth/token"
user-info-uri: "https://my-auth-server/userinfo"
user-info-authentication-method: "header"
jwk-set-uri: "https://my-auth-server/token_keys"
user-name-attribute: "name"
Для постачальників OpenID Connect, які підтримують виявлення OpenID
Connect,
конфігурацію можна ще більше спростити. Постачальник повинен бути налаштований з використанням
issuer-uri
, який є URI-ідентифікатором, який додає твердження про те, що цей URI-ідентифікатор є
ідентифікатором видавця. Наприклад, якщо переданий issuer-uri
— "https://example.com", запит OpenID
Provider Configuration Request
буде зроблений на
"https://example.com/.well-known/openid-configuration".
Очікується, що результатом буде відповідь OpenID Provider Configuration Response
. У цьому прикладі
показано, як постачальник OpenID Connect можна налаштувати за допомогою issuer-uri
:
spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
spring:
security:
oauth2:
client:
provider:
oidc-provider:
issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"
За замовчуванням OAuth2LoginAuthenticationFilter
у Spring Security обробляє тільки URL-адреси,
відповідні /login/oauth2/code/*
. Якщо потрібно налаштувати redirect-uri
на
використання
іншого шаблону, потрібно створити конфігурацію для обробки цього шаблону. Наприклад, для додатків сервлетів
можна
додати власну SecurityFilterChain
, яка буде схожа на таку:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration(proxyBeanMethods = false)
public class MyOAuthClientConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
http.oauth2Login((login) -> login.redirectionEndpoint().baseUri("custom-callback"));
return http.build();
}
}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.web.SecurityFilterChain
@Configuration(proxyBeanMethods = false)
class MyOAuthClientConfiguration {
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http.authorizeRequests().anyRequest().authenticated()
http.oauth2Login().redirectionEndpoint().baseUri("custom-callback")
return http.build()
}
}
InMemoryOAuth2AuthorizedClientService
, який використовується Spring Security для керування
процедурами
реєстрації клієнтів. InMemoryOAuth2AuthorizedClientService
має обмежені можливості, тому ми
рекомендуємо використовувати його тільки в оточеннях розробки. У виробничих оточеннях використовуй JdbcOAuth2AuthorizedClientService
або створи власну реалізацію OAuth2AuthorizedClientService
.
Реєстрація клієнтів OAuth2 для спільних постачальників
Для поширених постачальників OAuth2 та
OpenID, включно з Google, Github, Facebook та
Okta, ми передбачаємо набір постачальників за замовчуванням (google
, github
,
facebook
та okta
, відповідно).
Якщо не потрібно налаштовувати цих постачальників,
то можеш встановити атрибут provider
для того, для якого потрібно вивести значення за
замовчуванням.
До того ж, якщо ключ для реєстрації клієнта збігається з постачальником, що підтримується за замовчуванням,
Spring
Boot визначить і його.
Іншими словами, дві конфігурації в наступному прикладі використовують постачальника Google:
spring.security.oauth2.client.registration.my-client.client-id=abcd
spring.security.oauth2.client.registration.my-client.client-secret=password
spring.security.oauth2.client.registration.my-client.provider=google
spring.security.oauth2.client.registration.google.client-id=abcd
spring.security.oauth2.client.registration.google.client-secret=password
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: "abcd"
client-secret: "password"
provider: "google"
google:
client-id: "abcd"
client-secret: "password"
Сервер ресурсів
Якщо у твоєму classpath є spring-security-oauth2-resource-server
, Spring
Boot може встановити сервер ресурсів OAuth2. Для конфігурації JWT необхідно вказати JWK Set URI або OIDC
Issuer
URI,
як показано в наступних прикладах:
spring. security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
spring:
security:
oauth2:
resourceserver:
jwt:
jwk-set-uri: "https://example.com/oauth2/default/v1/keys"
spring.security.oauth2.resourceserver. jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: "https://dev-123456.oktapreview.com/oauth2/default/"
spring.security.oauth2.resourceserver.jwt.public-key-location
, де
значення
має
вказувати на файл, який містить відкритий ключ, закодований у форматі PEM x509.
Ті ж властивості застосовні як для сервлетних, так і для реактивних додатків.
До того ж, можна
визначити власний бін JwtDecoder
для сервлетних додатків або ReactiveJwtDecoder
для
реактивних програм.
У випадках, якщо замість JWT використовуються непрозорі токени, можна налаштувати такі властивості для валідації токенів за допомогою інтроспекції:
spring.security.oauth2.resourceserver.opaquetoken.introspection-uri=https://example.com/check-token
spring.security.oauth2.resourceserver.opaquetoken.client-id=my-client-id
spring.security.oauth2.resourceserver.opaquetoken.client-secret=my-client-secret
spring:
security:
oauth2:
resourceserver:
opaquetoken:
introspection-uri: "https://example.com/check-token"
client-id: "my-client-id"
client-secret: "my-client-secret"
Знову ж, ті самі властивості застосовні як для сервлетних, так і для реактивних додатків.
В якості альтернативи можна визначити власний бін OpaqueTokenIntrospector
для сервлетних
додатків
або
ReactiveOpaqueTokenIntrospector
для реактивних додатків.
Сервер авторизації
Наразі Spring Security не передбачає підтримки для реалізації сервера авторизації
OAuth 2.0. Однак ця функціональність доступна з проєкту Spring Security OAuth, який з часом буде повністю
витіснений
Spring Security. До того часу можна використовувати модуль spring-security-oauth2-autoconfigure
для
простого налаштування сервера авторизації OAuth 2.0; див. документацію
для ознайомлення з інструкціями.