如何配置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=false3. 重写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
相关产品推荐
相关产品推荐

