Скажите, что я постепенно привлекаю новых пользователей, предлагая им способ входа в систему с помощью Spring Security Oauth2 + Google (или любого поставщика Oauth2), а затем где-нибудь в будущем, предлагая им возможность добавлять функции, которые требуют дополнительных Области Oauth2 (скажем, соединительный календарь).
У меня есть наивное рабочее решение, которое включает в себя превращение каждого набора областей в псевдо-провайдера в Spring Security Oauth2. Примерно так (пожалуйста, прости Kotlin):
@Configuration
@EnableWebSecurity
open class WebSecurityConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
}
@Bean
open fun clientRegistrationRepository(): ClientRegistrationRepository {
return InMemoryClientRegistrationRepository(googleClientRegistration(), googleWithCalendarClientRegistration())
}
private fun googleClientRegistration(): ClientRegistration {
// basic profile info
return CommonOAuth2Provider.GOOGLE.getBuilder("google")
.build()
}
private fun googleWithCalendarClientRegistration(): ClientRegistration {
// profile info with calendar
return CommonOAuth2Provider.GOOGLE.getBuilder("google-with-calendar")
.registrationId("google-with-calendar")
.redirectUriTemplate("{baseUrl}/{action}/oauth2/code/google")
.scope("openid", "profile", "email", "calendar.readonly")
.build()
}
}
Затем я могу связать своего пользователя с https://www.example.com/oauth2/authorization/google-with-calendar
, и Spring Security добросовестно повторно авторизирует пользователя с добавленной областью календаря.
Но что, если у меня есть вторая, а затем третья функция, каждая из которых добавляет область действия, и каждая из которых может быть объединена с любым другим набором функций? Мне придется создать нового псевдо-провайдера не только для каждой функции, но и для каждой комбинации функций.
Я нашел этот вопрос и ответ, что интересно, но воспринимается как хак только немного меньше, чем мое текущее решение.
Есть ли более идиоматический c способ запросить дополнительную область в Spring Security Oauth2?