Запрос дополнительных областей Oauth2 в Spring Security - PullRequest
0 голосов
/ 03 февраля 2020

Скажите, что я постепенно привлекаю новых пользователей, предлагая им способ входа в систему с помощью 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?

...