我希望我的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的建议)
2条答案
按热度按时间6jjcrrmo1#
您需要使用
requestMatcher
创建多个配置,并将它们限制为特定的URL模式。根据您的示例,您的配置应如下所示:安全配置HTML
安全配置API
xtupzzrd2#
我认为我们应该将
/oauth2/**
包含到请求匹配器中,否则oauth2Login
将无法工作。404 http://localhost:8080/oauth2/authorization/gitlab