Spring Boot 使用keycloak的Sping Boot 为特定端点添加API密钥验证

44u64gxh  于 2022-11-23  发布在  Spring
关注(0)|答案(1)|浏览(231)

在Sping Boot 应用程序中,我有:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(jsr250Enabled = true)
@Slf4j
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    List<String> aIPWhiteList;

    @Autowired
    List<String> bIPWhiteList;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        String aIPAddressesFilterStr = defineIPFilters(aIPWhiteList);
        String bIPAddressesPFilterStr = defineIPFiltersbIPWhiteList);

        http.authorizeRequests()
                .antMatchers("/order/a/**").access(aIPAddressesFilterStr)
                .antMatchers("/b/order").access(bIPAddressesFilterStr)
                .anyRequest().permitAll();

        http.cors().and().csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    private String defineP4IPFilters(List<String> whiteList) {
        StringBuilder ipAddressesFilterStr = new StringBuilder();
        for (String ip: whiteList) {
            ipAddressesFilterStr.append("hasIpAddress('").append(ip).append("') or ");
        }
        return ipAddressesFilterStr.substring(0, ipAddressesFilterStr.length() - 4);
    }
    
}

我想知道我如何为这个“B/order”做另一个认证,基于存储在头中的API密钥。基本上只有这1个端点我想授权用户不同。其他端点是由keycloak授权,从注册用户完成。但在这里我想只通过API密钥,这是静态的。
有什么主意吗?
谢谢!

qv7cva1a

qv7cva1a1#

我有两个想法,应该保存你相当一些麻烦,即使不直接回答你的问题:

不要使用KeycloakWebSecurityConfigurerAdapter

它是(非常)deprecated Keycloak adapters for spring的一部分。请改用spring-boot-starter-oauth2-resource-server。请指涉those tutorials以取得各种执行方式(使用Keycloak)

使用OAuth2客户端凭据流代替API密钥

它的作用就是:使用“静态”秘密来认证受信任的编程客户端。
使用Keycloak,只需声明“机密”客户端(“客户端身份验证”设置为“开”并启用“服务帐户角色”)。机密将从Keycloak管理控制台中的“凭据”选项卡中检索。然后,如果需要,您可以为每个客户端定义和分配不同的角色(这些角色将出现在访问令牌中,因此您可以在spring安全访问控制决策中使用它)
这类客户端将使用您的Keycloak示例颁发的访问令牌来授权它们对资源服务器的请求,就像其他客户端(由人类使用)所做的那样。只有获取令牌的协议(OAuth2流)不同:用于“机器人”的客户端凭证和用于“人类”的授权码。
从资源-服务器的Angular 来看,绝对没有区别:所有的请求将被授权以由相同的授权服务器发出的访问令牌=〉在一些端点上不需要不同的认证机制,仅应用常规的基于角色的访问控制或其它用Spring安全表达式编写的任何东西。

相关问题