You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置SAP Commerce Cloud OCC层对接Keycloak OpenID Connect身份提供商

解决方案:用Keycloak OIDC替换Commerce Cloud OCC的默认身份验证

可以通过自定义扩展+Spring Security配置实现,无需硬改OOTB的OAuth2组件,具体步骤如下:

  • 1. 创建自定义Security扩展
    新建一个Commerce扩展(比如命名为keycloak-occ-security),避免修改官方自带的oauth2扩展。在扩展的pom.xml中添加Keycloak Spring Security Adapter依赖:

    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-spring-security-adapter</artifactId>
        <version>匹配你的Keycloak版本</version>
    </dependency>
    
  • 2. 配置Keycloak客户端参数
    在Commerce的local.properties中添加Keycloak核心配置:

    # Keycloak基础配置
    keycloak.auth-server-url=https://你的Keycloak域名/auth
    keycloak.realm=你的Realm名称
    keycloak.resource=commerce-occ-client
    keycloak.credentials.secret=你的客户端密钥
    keycloak.use-resource-role-mappings=true
    keycloak.bearer-only=true
    
    # 关闭默认OCC OAuth2验证
    occ.security.oauth2.enabled=false
    
  • 3. 重写Spring Security配置
    在自定义扩展中创建Spring Security配置类,替换默认的OAuth2验证逻辑:

    @Configuration
    @EnableWebSecurity
    public class KeycloakOccSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            KeycloakAuthenticationProvider authProvider = keycloakAuthenticationProvider();
            // 自定义角色转换器,将Keycloak角色映射到Commerce的USER_ROLE
            authProvider.setGrantedAuthoritiesMapper(authorities -> {
                return authorities.stream()
                        .map(authority -> new SimpleGrantedAuthority(authority.getAuthority()))
                        .filter(auth -> auth.getAuthority().equals("ROLE_USER") || auth.getAuthority().equals("USER_ROLE"))
                        .collect(Collectors.toList());
            });
            auth.authenticationProvider(authProvider);
        }
    
        @Bean
        @Override
        protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
            return new NullAuthenticatedSessionStrategy(); // OCC为无状态服务,无需会话
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            super.configure(http);
            // 对所有OCC端点启用Keycloak验证
            http.authorizeRequests()
                    .antMatchers("/occ/**").hasAnyRole("USER")
                    .anyRequest().permitAll();
            http.csrf().disable(); // OCC场景通常禁用CSRF
        }
    }
    
  • 4. 配置Spartacus客户端
    在Spartacus的app.module.ts中配置Keycloak作为OIDC身份提供商,确保请求OCC时自动携带Bearer令牌:

    import { AuthModule, AuthConfig } from '@spartacus/core';
    
    const authConfig: AuthConfig = {
      authentication: {
        oauth: {
          client_id: 'commerce-occ-client',
          client_secret: '你的客户端密钥',
          tokenEndpoint: 'https://你的Keycloak域名/auth/realms/你的Realm名称/protocol/openid-connect/token',
          loginUrl: 'https://你的Keycloak域名/auth/realms/你的Realm名称/protocol/openid-connect/auth',
          logoutUrl: 'https://你的Keycloak域名/auth/realms/你的Realm名称/protocol/openid-connect/logout',
          scope: 'openid profile email',
        },
      },
    };
    
    @NgModule({
      imports: [AuthModule.forRoot(authConfig)],
      // 其他模块配置
    })
    export class AppModule {}
    
  • 5. 验证角色映射
    确保Keycloak中从Commerce同步过来的用户角色(比如USER_ROLE)被正确转换为Spring Security权限,这样带有@Secured(USER_ROLE)注解的OCC端点就能正常验证令牌。

这个方案利用Commerce的扩展机制,通过自定义Spring Security配置覆盖默认OAuth2逻辑,完全兼容Keycloak OIDC,避免了修改官方内置配置带来的耦合问题。

内容的提问来源于stack exchange,提问作者Samuel Miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:22:43