我有一个spring-boot服务,该服务使用OpenID Connect / OAuth2使用Okta Platform API对用户进行身份验证。当用户尝试访问我的服务时,他们将被重定向到Okta登录页面并进行身份验证,然后Okta将他们重定向回我的服务。

这是我的pom.xml的相关部分

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-oauth2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-security</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

这是我的控制器代码:
@RestController
@EnableOAuth2Sso
@SpringBootApplication
public class Application {

    @RequestMapping(path = "/", method = RequestMethod.GET)
    public String home(Authentication auth) {
        return "Home: " + auth.getName();
    }

    @RequestMapping(path = "/app", method = RequestMethod.POST)
    public String app(Authentication auth) {
        return "App: " + auth.getName();
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这对于第一种GET控制器方法非常有效,但对于第二种POST方法,我的服务需要我提供CSRF token 。我想完全禁用CSRF检查,所以我将此添加到了我的应用中
@Configuration
@EnableOAuth2Sso
public class Config extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
    }
}

但是,添加上述配置后,我的服务停止了使用Okta对用户进行身份验证(不再将未经身份验证的请求重定向到Okta)。它直接使用null参数调用home()方法。

我按照此博客文章创建了服务https://developer.okta.com/blog/2017/03/21/spring-boot-oauth

如何在仍将OAuth2 SSO身份验证与Okta结合使用时完全禁用CSRF?

最佳答案

我遇到了完全相同的问题。在深入研究HttpSecurity类的工作方式之后,我修改了configure()函数,如下所示:

    @EnableWebSecurity
public static class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.authorizeRequests().anyRequest().authenticated().and().oauth2Login().and().csrf().disable();
    }
}

添加构建器子句authorizeRequests()。anyRequest()。authenticated()。and()。oauth2Login()会强制控制器拦截具有OAuth身份验证的请求。您将在Spring HttpSecurity.java源代码中找到完整记录的文档。

可以肯定的是,我修改了我所有的REST端点方法,以将 token 作为参数包含在内,并且可以在原始版本的configure()方法中看到该 token 为null,但是一旦添加了额外的子句,便包含了该 token 。

07-24 09:53
查看更多