首页 > 解决方案 > 如何使用具有多个资源 ID 的 ResourceServer 实现来保护 api?

问题描述

我有一个要求,我需要在我的应用程序中使用由不同资源服务器获得的不同令牌来保护不同的 api 集。

/api/user/** -> API 应该使用 token(T1) 进行身份验证,从提供者 RS1 获得 /api/admin/** -> API 应该使用 token(T2) 进行身份验证,从提供者 RS2 获得

T1 应该不能访问 /api/admin/** 并且 T2 应该不能访问 /api/user/**

两者 - RS1 和 RS2 都发出 JWT。

这怎么可能,使用 Spring 的资源服务器实现?任何指针表示赞赏。

标签: spring-bootspring-security

解决方案


我假设您的意思是说不同的令牌是从不同的授权服务器获得的。

在这种情况下,您可以查看多租户应用程序。

区分租户的一种方法是通过发行人索赔。为此,您可以使用 aJwtIssuerAuthenticationManagerResolverJwtIssuerReactiveAuthenticationManagerResolver

@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    JwtIssuerReactiveAuthenticationManagerResolver authenticationManagerResolver = 
            new JwtIssuerReactiveAuthenticationManagerResolver(
                    "https://idp.example.org/issuerOne",
                    "https://idp.example.org/issuerTwo");

    http
            .authorizeExchange(exchanges -> exchanges
                    .anyExchange().authenticated()
            )
            .oauth2ResourceServer(oauth2 -> oauth2
                    .authenticationManagerResolver(authenticationManagerResolver)
            );
    return http.build();
}

以下是一些可帮助您入门的更多资源:


推荐阅读