首页 > 解决方案 > 在 Spring Security 中请求额外的 Oauth2 范围

问题描述

假设我正在逐渐吸引我的新用户,为他们提供一种使用 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-calendarSpring Security,并通过添加的日历范围忠实地重新授权用户。

但是,如果我有第二个,然后是第三个特性,每个特性都增加了一个范围,并且每个特性都可以与任何其他特性集结合起来怎么办?我将不得不为每个功能创建一个新的伪提供程序,但为每个功能组合

我发现了这个问题和答案,这很有趣,但感觉比我目前的解决方案略少一点。

在 Spring Security Oauth2 中是否有更惯用的方法来请求额外的范围?

标签: kotlinspring-securityoauth-2.0spring-security-oauth2

解决方案


推荐阅读