在同一上下文中使用Sping Boot 2 OAuth客户端和资源服务器

yx2lnoni  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(131)

我希望我的spring boot应用程序能够服务于一个受保护的前端,同时也是一个API资源服务器,但是我不能让oauth的东西工作。
我想要的是当浏览器请求index.html而不使用令牌时,spring boot应用程序返回一个302重定向到oauth服务器(在我的例子中是gitlab),这样用户就被发送到登录表单。但我也希望当调用API而不使用令牌时,API返回一个401,因为我认为302重定向到登录页面在那里不是很有用。
在伪代码中:

if document_url == /index.html and token not valid
  return 302 https//gitlab/loginpage
if document_url == /api/restcall and token not valid
  return 401
server document_url

我正在使用spring boot 2.1,关于我的pom.xml包含的oauth

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>

这是我在SecurityConfig中的一次天真尝试

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests().antMatchers("/index.html").authenticated()
        .and()
            .oauth2Login().loginPage("/oauth2/authorization/gitlab")

        .and()
            .authorizeRequests().antMatchers("/api/restcall").authenticated()
        .and()
            .oauth2ResourceServer().jwt();
    }
}

两种配置(oauth2Login和oauth2ResourceServer)本身都很好用,但是一旦我把它们组合在一起,最后一个就占了上风(所以在上面的例子中不会有302,浏览器也会看到index.html的401),我假设它们共享一些配置对象,所以最后一个写操作占了上风。
有没有(简单的)方法可以得到我想要的?我知道Spring几乎可以做任何事情,但我非常不希望最终手动配置大量的Bean ...

    • 更新日期:**

我已经为我的代码here做了一个最小的示例(包括@dur的建议)

6jjcrrmo

6jjcrrmo1#

您需要使用requestMatcher创建多个配置,并将它们限制为特定的URL模式。根据您的示例,您的配置应如下所示:

安全配置HTML

public class SecurityConfigHTML extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .requestMatchers().antMatchers("/index.html")
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .oauth2Login().loginPage("/oauth2/authorization/gitlab");
    }
}

安全配置API

public class SecurityConfigAPI extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .requestMatchers().antMatchers("/api/call")
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .oauth2ResourceServer().jwt();
    }
}
xtupzzrd

xtupzzrd2#

    • 安全配置HTML**

我认为我们应该将/oauth2/**包含到请求匹配器中,否则oauth2Login将无法工作。404 http://localhost:8080/oauth2/authorization/gitlab

public class SecurityConfigHTML extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http
                .requestMatchers().antMatchers("/index.html", "/oauth2/**")
                .and()
                .authorizeRequests()
                .antMatchers("/oauth2/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2Login();
        // @formatter:on
    }
}

相关问题