Я попытался повторить ваш вариант использования: я разрабатываю AuthServer с весенней облачной безопасностью и ResourceServer. Проблема, которую я вижу при использовании стратегии token-info-uri, заключается в том, что весной для проверки токена используется RemoteTokenServices, а для получения информации о токене используется OAuth2RestTemplate. конфигурации, как показано ниже:
@EnableOAuth2Client
@EnableResourceServer
@SpringBootApplication
public class HelloOauthServiceApplication {
public static void main(String[] args) {
SpringApplication.run(HelloOauthServiceApplication.class, args);
}
@Bean
public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails resource){
return new OAuth2RestTemplate(resource);
}
}
обратите внимание на определение @EnableOAuth2Client
и OAuth2RestTemplate
bean. Spring использует эту конфигурацию для проверки и обновления вашего токена.
Однако в этом случае любой ресурсный сервер должен быть также клиентским приложением, и, по моему опыту, он не масштабируется. Мой личный совет - использовать стратегию user-info-uri. В этом случае Spring будет использовать специальную конечную точку, чтобы удалить пользовательское уведомление. конфигурация очень проста в вашем сервере ресурсов, вы определяете только @EnableResourceServer
, как в вашем примере в вашем yaml вы можете настроить только часть ресурса, как показано ниже
security:
oauth2:
resource:
user-info-uri: http://localhost:9090/account/userInfo.json
preferTokenInfo: false
Единственная дополнительная разработка - это ваш сервер аутентификации, который должен предоставлять информацию о пользователе в конечной точке, как показано ниже:
@RestController
@RequestMapping("/account")
class UserRestFullEndPoint {
@GetMapping("/userInfo")
public Principal userInfo(Principal principal){
return principal;
}
}
Я использую этот подход много раз, и я заметил, что он работает очень хорошо и масштабируется, потому что на ваших ресурсных серверах вы не определяете его, как и клиентское приложение.
Я надеюсь, что это может быть полезно
приписка
в вашей конфигурации вы забыли протокол http:
server:
port: 9090
servlet:
context-path: /client
spring:
application:
name: client-server
security:
oauth2:
client:
client-id: estrutura
client-secret: estruturasecret
access-token-uri: http://localhost:9999/oauth/token
user-authorization-uri: http://localhost:9999/oauth/authorize
resource:
token-info-uri: http://localhost:9999/oauth/check_token
logging:
level:
org.springframework.security: DEBUG