gpt4 book ai didi

spring-security - Spring OAuth : Resource Server with Authorization Server backend

转载 作者:行者123 更新时间:2023-12-04 04:25:20 27 4
gpt4 key购买 nike

我想开发两个独立的服务,一个用于业务,一个用于使用 Spring OAuth 2 进行用户身份验证

我们称它们为 Business-Service 和 OAuth-Service。

现在,如果请求未通过身份验证,我希望将业务服务委托(delegate)给 OAuth 服务。客户端应用程序(Android 应用程序)不应该先验地知道 OAuth-Service,它应该只由 Business-Service 委派给它,并针对未经身份验证的请求使用 302 HTTP 重定向。准确地说,我希望我的 API 登录页面提供指向 http://businessservice.com/login 的链接。当我的客户端应用程序决定遵循此链接时,它会被重定向到 OAuth 服务。

如果我用 @EnableOAuth2Resource 注释业务服务,它的所有资源都受到保护,当我在没有访问 token 的情况下 curl 它们时返回 401。到现在为止还挺好。如果我提供这样的访问 token :

curl -v http://localhost:8667/resource/ -H "Authorization: Bearer $TOKEN"

我可以访问该资源。还好。

但是,如果我用 @EnableOAuth2Sso 注释业务服务为了启用到 OAuth 服务的重定向,它失去了使用访问 token 访问资源的能力(与上面相同的 curl),它只返回 302 到登录页面 http://localhost:8667/login

如果我同时使用这两个注释,@EnableOAuth2Resource 似乎总是“获胜”,因为身份验证有效但调用 http://localhost:8667/login返回 404。

那么创建一个资源服务器的正确方法是什么,该资源服务器委托(delegate)给身份验证服务器进行非身份验证调用呢?

最佳答案

经过几个小时的尝试,我现在找到了解决方案。

业务服务器(资源服务器)现在看起来如下:

@SpringBootApplication
@EnableOAuth2Sso
@EnableOAuth2Resource
public class BusinessService {

public static void main(final String[] args) {
final ConfigurableApplicationContext context = SpringApplication.run(BusinessService.class, args);
}

}

有两种配置,一种用于 SSO:
@Configuration
public class OAuth2SsoConfiguration extends OAuth2SsoConfigurerAdapter {

@Override
public void match(final RequestMatchers matchers) {
matchers.antMatchers("/");
}

@Override
public void configure(final HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().permitAll();
}

}

一个用于资源:
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

@Override
public void configure(final HttpSecurity http) throws Exception {
http.requestMatchers().antMatchers("/resource/**").and().authorizeRequests().anyRequest().authenticated().antMatchers("/").permitAll();

}

}

这将导致以下结果:
curl -v http://localhost:8667/

返回
HTTP/1.1 200 OK
{"links":[{"rel":"login","href":"http://localhost:8667/login"}]}

curl -v http://localhost:8667/resource/

返回
HTTP/1.1 401 Unauthorized
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}

curl -v http://localhost:8667/login

返回
HTTP/1.1 302 Found
Location: http://localhost:8666/user/oauth/authorize?client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A8667%2Flogin&response_type=code&state=YmmNO9

因此,我的业务服务作为资源服务器受到保护,为所有业务资源返回 401。服务的根适用于所有客户端,因此他们可以发现登录关系,如果他们遵循这种关系,他们将被重定向到授权服务器

关于spring-security - Spring OAuth : Resource Server with Authorization Server backend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29014094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com