OAuth2 (открытая авторизация 2.0) — это открытый стандартный протокол авторизации для доступа к ресурсам пользователя, хранящимся у поставщика услуг, через сторонние приложения без раскрытия учетных данных пользователя (например, имени пользователя и пароля). Это позволяет пользователям разрешать сторонним приложениям доступ к защищенным ресурсам, гарантируя при этом, что учетные данные пользователей не будут напрямую доступны сторонним приложениям.
Целью разработки протокола OAuth2 является упрощение процесса авторизации и повышение безопасности за счет делегирования авторизации и использования токенов для обеспечения безопасной связи между пользователями и сторонними приложениями. Он стал распространенным стандартом авторизации, используемым многими поставщиками интернет-услуг и разработчиками при создании приложений.
Роль OAuth2 заключается в реализации стандартизированного процесса авторизации пользователей и доступа к ресурсам, а также в обеспечении безопасного и масштабируемого способа управления разрешениями сторонних приложений на доступ к пользовательским ресурсам. Вот некоторые важные роли OAuth2:
Spring Security OAuth2 — это модуль расширения платформы Spring Security, используемый для реализации функций аутентификации и авторизации на основе протокола OAuth2. Он предоставляет набор простых в использовании и интегрированных API, которые помогают разработчикам реализовывать различные режимы авторизации и процессы OAuth2 в приложениях Spring.
Spring Security OAuth2 расширяет функции Spring Security и предоставляет такие функции, как настройка и управление клиентами OAuth2, серверами авторизации, хранилищем токенов и управлением разрешениями. Это позволяет разработчикам легко создавать безопасные службы OAuth2 и клиентские приложения.
Теперь давайте более подробно рассмотрим работу протокола OAuth2 и различные режимы авторизации.
В OAuth2 сначала нужно зарегистрировать клиент и настроить сервер авторизации. Клиент — это приложение, которому необходим доступ к защищенным ресурсам, а сервер авторизации отвечает за аутентификацию пользователя и выдачу токенов доступа.
Ниже приведен пример фрагмента кода, демонстрирующий, как настроить серверы регистрации и авторизации клиентов в Spring Security:
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client1")
.secret(passwordEncoder().encode("client1secret"))
.authorizedGrantTypes("authorization_code", "refresh_token")
.scopes("read", "write")
.redirectUris("http://localhost:8080/callback");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
В приведенном выше коде,мы использовали
@EnableAuthorizationServer
аннотация для включения авторизациисервер,и пройтиconfigure(ClientDetailsServiceConfigurer clients)
метод настраивает хранящийся в памятиклиент。клиентIDдля"client1",Пароль: «client1secret».,Режимы авторизации: «authorization_code» и «refresh_token».,Область авторизации — «чтение» и «запись».,перезвонитьURLдля"http://localhost:8080/callback"。
Режим кода авторизации — наиболее часто используемый режим авторизации в OAuth2. В этом режиме клиент перенаправляет пользователя на страницу входа на сервер авторизации. После того, как пользователь авторизуется и соглашается на авторизацию, сервер авторизации возвращает код авторизации клиенту. Затем клиент использует код авторизации для запроса токена доступа с сервера авторизации.
Ниже приведен пример кода для процесса режима кода авторизации:
@Controller
public class AuthorizationCodeController {
@GetMapping("/authorize")
public String authorize(@RequestParam("response_type") String responseType,
@RequestParam("client_id") String clientId,
@RequestParam("redirect_uri") String redirectUri,
@RequestParam("scope") String scope,
@RequestParam("state") String state) {
// Обработайте запрос авторизации и вернитесь на страницу авторизации.
}
@GetMapping("/callback")
public String callback(@RequestParam("code") String code,
@RequestParam("state") String state) {
// Обработать обратный вызов кода авторизации и запросить токен доступа с сервера авторизации.
}
}
В приведенном выше коде,
/authorize
Конечная точка, используемая для обработки запросов авторизации,Путем перенаправления пользователя на авторизованную страницу входа.,После того как пользователь авторизуется и согласится на авторизацию,Сервер авторизации возвращает код авторизации клиенту. Затем,клиентперенаправит пользователей наredirect_uri
назначенныйперезвонитьURL,И вперезвонитьURLПолучить код авторизации。/callback
Конечная точка для обработки кодов авторизацииперезвонить,клиент После получения кода авторизации через URL обратного вызова,Запросы могут быть отправлены на авторизованный сервер.,Получите токен доступа, используя код авторизации。 Аналогичным образом существуют режимы авторизации, такие как упрощенный режим, режим пароля, режим учетных данных клиента и токен обновления. Каждая модель авторизации имеет разные процессы и реализации кода.
Ниже приведен пример кода процесса OAuth2:
@Controller
public class OAuth2Controller {
@Autowired
private OAuth2RestTemplate restTemplate;
@GetMapping("/authorize")
public String authorize() {
// Перенаправить пользователя на авторизованную страницу входа
}
@GetMapping("/callback")
public String callback(@RequestParam("code") String code) {
// Запросите токен доступа у сервера авторизации, используя код авторизации.
}
@GetMapping("/protected-resource")
public String protectedResource() {
// Доступ к защищенным ресурсам с помощью токенов доступа
}
}
В приведенном выше коде,
/authorize
Конечная точка, используемая для перенаправления пользователей на авторизациюсерверстраница входа。После того как пользователь авторизуется и согласится на авторизацию,URL-адрес обратного вызова, который разрешает серверу перенаправлять пользователя обратно к клиенту.,И включите код авторизации в URL./callback
Конечная точка для обработки кодов авторизацииперезвонить,клиент После получения кода авторизации через URL обратного вызова,Может Запросите токен доступа у сервера авторизации, используя код авторизации.。/protected-resource
Конечная точка используется для демонстрации того, как Доступ к защищенным ресурсам с помощью токенов доступ. в практическом применении,Вы можете использовать токены доступа для доступа к API или ресурсам, требующим авторизации.
3.1 Роли и концепции в OAuth2:
В протоколе OAuth2 существуют следующие основные роли и концепции:
3.2 Генерация и проверка токенов:
В OAuth2 токен — это учетные данные, используемые для представления разрешений на авторизацию. Обычно токены генерируются сервером авторизации, передаются и проверяются между клиентом и сервером ресурсов.
Процесс генерации и проверки токена можно проиллюстрировать следующим примером кода:
// Пример кода для создания токена доступа
String generateAccessToken() {
// Создать строку токена произвольного доступа
String accessToken = generateRandomToken();
// Установить срок действия токена доступа
Date expiration = calculateExpirationDate();
// Сохраните токен доступа в базу данных или кеш
saveAccessToken(accessToken, expiration);
return accessToken;
}
// Пример кода для проверки токена доступа
boolean validateAccessToken(String accessToken) {
// Получите токен доступа и срок действия из базы данных или кеша.
AccessToken storedToken = getAccessTokenFromDatabase(accessToken);
// Убедитесь, что токен доступа существует и срок его действия не истек.
if (storedToken != null && storedToken.isExpired()) {
return false;
}
return true;
}
В приведенном выше примере,
generateAccessToken
Метод, используемый для генерации токена произвольного доступа,и установите срок его действия,Затем Сохраните токен доступа в базу данных или кеш。validateAccessToken
Метод, используемый для проверки правильности переданного токена доступа.,Проверка осуществляется путем получения токена из базы данных или кэша и проверки его существования и срока действия.
В протоколе OAuth2 сервер авторизации и сервер ресурсов взаимодействуют для проверки действительности токена и разрешения на авторизацию.
Ниже приведен пример кода для взаимодействия сервера авторизации и сервера ресурсов:
// Авторизоватьсервер Пример кода для проверки токена доступа
boolean validateAccessToken(String accessToken) {
// Отправьте запрос на проверку на сервер ресурсов
boolean isValid = resourceServer.validateToken(accessToken);
return isValid;
}
// ресурссервер Пример кода для проверки токена доступа
boolean validateToken(String accessToken) {
// Получите токен доступа и срок действия из базы данных или кеша.
AccessToken storedToken = getAccessTokenFromDatabase(accessToken);
// Убедитесь, что токен доступа существует и срок его действия не истек.
if (storedToken != null && storedToken.isExpired()) {
return false;
}
return true;
}
При внедрении протокола OAuth2 необходимо учитывать следующие вопросы безопасности и принимать соответствующие меры защиты:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requiresChannel()
.anyRequest().requiresSecure();
}
}
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
// Ключи хранятся в базе данных или файле конфигурации.
private static final String SECRET_KEY = "your-secret-key";
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("your-client-id")
.secret(SECRET_KEY)
.authorizedGrantTypes("password", "refresh_token")
.scopes("read", "write")
.accessTokenValiditySeconds(3600)
.refreshTokenValiditySeconds(86400);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore());
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey(SECRET_KEY);
return converter;
}
}
Конфигурация сервера ресурсов:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/**").authenticated();
}
}
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
// ...
@Autowired
private TokenStore tokenStore;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore)
.tokenEnhancer(tokenEnhancerChain());
}
@Bean
public TokenEnhancerChain tokenEnhancerChain() {
TokenEnhancerChain chain = new TokenEnhancerChain();
chain.setTokenEnhancers(Arrays.asList(accessTokenConverter()));
return chain;
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/**").hasAnyRole("USER", "ADMIN")
.and()
.addFilterBefore(rateLimitFilter(), UsernamePasswordAuthenticationFilter.class);
}
@Bean
public RateLimitFilter rateLimitFilter() {
return new RateLimitFilter();
}
}
Затем создайте фильтр для управления. Здесь используется OncePerRequestFilter:
public class RateLimitFilter extends OncePerRequestFilter {
private static final int MAX_REQUESTS_PER_SECOND = 10;
private final Map<String, Long> requestCounts = new ConcurrentHashMap<>();
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String clientId = getClientId(request);
if (clientId != null) {
if (exceedsRateLimit(clientId)) {
response.sendError(HttpStatus.TOO_MANY_REQUESTS.value(), "Rate limit exceeded");
return;
} else {
incrementRequestCount(clientId);
}
}
filterChain.doFilter(request, response);
}
private String getClientId(HttpServletRequest request) {
// Получить clientID по запросу
// Например, получить его из заголовка запроса или получить из параметра запроса.
return request.getHeader("Client-Id");
}
private boolean exceedsRateLimit(String clientId) {
long currentTimestamp = System.currentTimeMillis();
requestCounts.entrySet().removeIf(entry -> entry.getValue() < currentTimestamp - 1000);
return requestCounts.compute(clientId, (k, v) -> v == null ? 1 : v + 1) > MAX_REQUESTS_PER_SECOND;
}
private void incrementRequestCount(String clientId) {
requestCounts.compute(clientId, (k, v) -> v == null ? 1 : v + 1);
}
}
первый,Добавьте необходимые зависимости в проектpom.xml
в файле:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Затем,существоватьapplication.properties
илиapplication.yml
в файле Настройка аудита безопасностиимонитор:
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.endpoint.auditevents.enabled=true
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
auditevents:
enabled: true
После настройки этого,Можетпутем доступа/actuator/auditevents
Конечная точка для получения информации о событиях аудита, связанной с токеном.。
Эти компоненты работают вместе для реализации механизма аутентификации и авторизации OAuth2. Ниже мы подробно объясним, как настроить и использовать эти компоненты.
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client_id")
.secret("client_secret")
.authorizedGrantTypes("authorization_code", "refresh_token")
.scopes("read", "write")
.accessTokenValiditySeconds(3600)
.refreshTokenValiditySeconds(86400);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
}
В приведенном выше коде,мы проходим
@EnableAuthorizationServer
Авторизация аннотаций включенасервер,и унаследовалAuthorizationServerConfigurerAdapter
Класс для настройки авторизациисервер。существоватьconfigure
в методе,Мы настроили простой клиент,включатьклиентID、ключ、Тип авторизации、Область действия и срок действия токенов доступа и обновления.。существоватьconfigure
в методе,Мы также будемauthenticationManager
Ввести вAuthorizationServerEndpointsConfigurer
середина,для аутентификации пользователя.
AuthorizationServerConfigurerAdapter
иResourceServerConfigurerAdapter
Класс для реализации пользовательской конфигурации。@Configuration
@EnableAuthorizationServer
public class CustomAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
// Настройка пользовательского сервера авторизации
}
@Configuration
@EnableResourceServer
public class CustomResourceServerConfig extends ResourceServerConfigurerAdapter {
// Настройка сервера пользовательских ресурсов
}
В приведенном выше коде,Мы отдельно продлили
AuthorizationServerConfigurerAdapter
иResourceServerConfigurerAdapter
добрый,и использовать@EnableAuthorizationServer
и@EnableResourceServer
Аннотация включает пользовательскую авторизациюсервериресурссервер。нас Можетсуществовать Соответствующая конфигурациядобрыйсередина Добавить пользовательскую конфигурацию,Например, определить правила доступа, менеджеры аутентификации и т. д.
Клиент инициирует запрос аутентификации на сервер авторизации, предоставляя идентификатор клиента, ключ, тип авторизации и другую информацию.
// Пример кода клиента для инициирования запроса аутентификации
RestTemplate restTemplate = new RestTemplate();
// Создание параметров запроса аутентификации
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "password");
params.add("username", "user");
params.add("password", "password");
params.add("client_id", "client_id");
params.add("client_secret", "client_secret");
// Инициировать запрос аутентификации
ResponseEntity<TokenResponse> response = restTemplate.postForEntity("http://localhost:8080/oauth/token", params, TokenResponse.class);
TokenResponse tokenResponse = response.getBody();
Сервер авторизации проверяет личность и разрешения клиента, а также выдает токены доступа и токены обновления.
// Пример кода для настройки сервера авторизации
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client_id")
.secret("client_secret")
.authorizedGrantTypes("password", "refresh_token")
.scopes("read", "write")
.accessTokenValiditySeconds(3600)
.refreshTokenValiditySeconds(86400);
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
}
Клиент использует токен доступа, чтобы запросить сервер ресурсов для получения ограниченных ресурсов.
// пример клиентского кода для запроса сервера ресурсов
RestTemplate restTemplate = new RestTemplate();
// Установить токен доступа
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + tokenResponse.getAccess_token());
HttpEntity<String> entity = new HttpEntity<>(headers);
// Запрос ограниченных ресурсов
ResponseEntity<String> response = restTemplate.exchange("http://localhost:8080/api/resource", HttpMethod.GET, entity, String.class);
String resource = response.getBody();
Сервер ресурсов проверяет достоверность и разрешения токена доступа и возвращает ограниченные ресурсы клиенту.
// Пример кода для настройки сервера ресурсов
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/resource").authenticated();
}
}
1. Настройте файл application.properties и добавьте конфигурацию, связанную с GitHub OAuth2: (не забудьте изменить его на свою собственную учетную запись и другие конфигурации здесь)
spring.security.oauth2.client.registration.github.client-id=your-client-id
spring.security.oauth2.client.registration.github.client-secret=your-client-secret
spring.security.oauth2.client.registration.github.scope=user:email
spring.security.oauth2.client.registration.github.redirect-uri=http://localhost:8080/login/oauth2/code/github
spring.security.oauth2.client.provider.github.authorization-uri=https://github.com/login/oauth/authorize
spring.security.oauth2.client.provider.github.token-uri=https://github.com/login/oauth/access_token
spring.security.oauth2.client.provider.github.user-info-uri=https://api.github.com/user
2. Создайте собственную страницу входа (login.html), содержащую кнопку входа в GitHub:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<a href="/login/github">Login with GitHub</a>
</body>
</html>
3. Создайте контроллер для обработки запросов на вход и обратных вызовов:
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/login/github")
public RedirectView loginWithGithub() {
return new RedirectView("/oauth2/authorization/github");
}
@GetMapping("/login/oauth2/code/github")
public String handleGithubCallback(@RequestParam("code") String code) {
// Обработка логики обратного вызова GitHub
return "redirect:/home";
}
}
Создайте HomeController для проверки страницы после успешного входа в систему:
@Controller
public class HomeController {
@GetMapping("/home")
public String home() {
return "home";
}
}
Создайте класс конфигурации WebSecurityConfigurerAdapter, чтобы включить вход OAuth2:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password("{noop}password")
.roles("USER");
}
}
Вход успешен!
Создание нескольких микросервисов Создайте Spring для сервисов торговых центров и серверных служб управления торговцами. Загрузочный проект. Можно использовать пружину Initializr(https://start.spring.io/) для быстрого создания скелета проекта.
Настройка клиента Spring Security OAuth2 В файлах конфигурации службы торгового центра и фоновой службы управления торговцами (например, application.properties или application.yml) добавьте следующую конфигурацию:
spring:
security:
oauth2:
client:
registration:
my-client: # идентификатор клиента, можно настроить
client-id: <your-client-id>
client-secret: <your-client-secret>
authorization-grant-type: client_credentials
scope: read, write
provider: my-provider # Авторизованное имя, может быть настроено
provider:
my-provider:
token-uri: <authorization-server-token-uri>
Пожалуйста, замените<your-client-id>
、<your-client-secret>
и<authorization-server-token-uri>
дляфактическая стоимость。Эти значения будут основаны на вашем разрешении.серверразличаться в зависимости от конфигурации。
Шаг 3. Создайте сервер авторизации Создайте отдельный сервер авторизации для выдачи токенов доступа и аутентификации клиентов. Сервер авторизации можно реализовать с помощью Spring Security OAuth2 и Spring Boot.
Сервер авторизации:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("<your-client-id>")
.secret("{noop}<your-client-secret>")
.authorizedGrantTypes("client_credentials")
.scopes("read", "write");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
}
Шаг 4. Настройте информацию о сервере авторизации и токен доступа микросервиса. В файлах конфигурации службы торгового центра и фоновой службы управления торговцами настройте информацию о сервере авторизации и токен доступа.
Пример файла конфигурации для сервиса торгового центра:
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: <your-client-id>
client-secret: <your-client-secret>
provider: my-provider
provider:
my-provider:
token-uri: <authorization-server-token-uri>
Пример файла конфигурации для серверной службы управления продавцами:
spring:
security:
oauth2:
client:
registration:
my-client:
client-id: <your-client-id>
client-secret: <your-client-secret>
provider: my-provider
provider:
my-provider:
token-uri: <authorization-server-token-uri>
Пожалуйста, замените
<your-client-id>
、<your-client-secret>
и<authorization-server-token-uri>
для您的фактическая стоимость。
Шаг 5. Настройте правила безопасности для микросервисов В службе торгового центра и фоновой службе управления торговцами настройте правила безопасности, включая правила доступа и контроль разрешений.
Пример настройки безопасности службы торгового центра:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/api/**").authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
}
Пример настройки безопасности серверной службы управления торговцами:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/api/**").authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
@Bean
public JwtDecoder jwtDecoder() {
NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) JwtDecoders.fromIssuerLocation("<authorization-server-issuer-uri>");
// Настройте JwtDecoder, включая проверку подписей и т. д.
return jwtDecoder;
}
}
Пожалуйста, замените<authorization-server-issuer-uri>
для你的Авторизоватьсервер ЭмитентURI。
В приведенном выше примере кода будут настроены правила безопасности внутренней службы управления торговцами.。Все с/public/
Запросы, начинающиеся с, будут разрешены без аутентификации,И с/api/
Запросы, начинающиеся с。
JwtDecoder
bean, мы можем настроить декодер JWT для проверки такой информации, как подпись токена JWT.import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
@Configuration
public class SecurityConfig {
@Bean
public JwtDecoder jwtDecoder() {
String issuerUri = "<authorization-server-issuer-uri>";
NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withJwkSetUri(issuerUri + "/.well-known/jwks.json").build();
// Настройте JwtDecoder, включая проверку подписей и т. д.
return jwtDecoder;
}
}
пожалуйста, измените<authorization-server-issuer-uri>
заменятьдля你的Авторизоватьсервер ЭмитентURI。
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-jose</artifactId>
<version>5.x.x</version>
</dependency>