Java(AWS部署)集成Okta SAML单点登录的步骤咨询
Okta SAML 2.0集成到Java应用的分步指南(适配多租户企业客户)
一、前置准备
- 确保你的Java应用已具备HTTPS访问能力(AWS环境可通过ALB搭配ACM证书实现),SAML协议强制要求HTTPS传输
- 收集每个企业客户的Okta租户域名(如C1的
c1.okta.com) - 准备应用的断言消费者服务(ACS)URL:按多租户规则定义,格式为
https://www.example.com/login/saml2/sso/{tenant-id}({tenant-id}替换为客户标识,如c1、c2) - 准备应用的实体ID(Entity ID):格式为
https://www.example.com/saml2/service-provider/{tenant-id},作为服务提供商的唯一标识
二、Okta端客户侧配置(指导客户完成)
每个企业客户需在自身Okta租户中创建SAML集成应用:
- 登录Okta管理员控制台,进入
Applications > Applications,点击Create App Integration - 选择
SAML 2.0,点击Next - 填写应用名称(如「Example.com 访问门户」),可上传应用Logo,点击
Next - 在
Configure SAML页面配置核心参数:Single sign on URL:填入你提供的对应客户ACS URL(如https://www.example.com/login/saml2/sso/c1),勾选Use this for Recipient URL and Destination URLAudience URI (SP Entity ID):填入对应客户的实体ID(如https://www.example.com/saml2/service-provider/c1)Name ID format:选择EmailAddress,应用用户名选user.email(需与你的系统用户邮箱字段匹配)- (可选)配置属性声明:按需传递用户姓名、部门等信息,比如Key填
firstName,Value选user.firstName;Key填lastName,Value选user.lastName
- 点击
Next,选择应用类型为This is an internal app that we have created,完成创建 - 进入应用
Sign On标签,点击View SAML Setup Instructions,获取以下信息并提供给你:- IdP Entity ID
- IdP Single Sign-On URL
- X.509 Certificate(用于验证SAML断言签名)
三、Java应用端集成(基于Spring Security SAML2,主流方案)
1. 添加依赖
如果是Spring Boot应用,添加Maven依赖:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-saml2-service-provider</artifactId> </dependency>
2. 多租户SAML配置
创建安全配置类,动态加载各客户的Okta IdP配置(可存储在AWS Secrets Manager或数据库中):
@Configuration @EnableWebSecurity public class SecurityConfig { @Autowired private TenantSamlProperties tenantSamlProperties; // 从配置源加载各客户SAML配置 @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()) .saml2Login(saml2 -> saml2 .authenticationManagerResolver(new TenantSamlAuthenticationManagerResolver(tenantSamlProperties)) ) .saml2Logout(saml2 -> saml2 .logoutRequest(logout -> logout.logoutUrl("/logout/saml2/slo/{tenant-id}")) ); return http.build(); } }
3. SAML断言映射
自定义转换器,将Okta返回的SAML属性映射到你的系统用户实体:
@Component public class CustomSaml2UserConverter implements Saml2AuthenticatedUserConverter { @Autowired private AppUserService userService; @Override public AbstractAuthenticationToken convert(Saml2AuthenticatedUser user, HttpServletRequest request) { // 提取SAML断言中的用户信息 String email = user.getEmail(); String firstName = user.getFirstname(); String lastName = user.getLastname(); // 查询或创建系统用户 AppUser appUser = userService.findOrCreateUserByEmail(email, firstName, lastName); return new UsernamePasswordAuthenticationToken(appUser, null, appUser.getAuthorities()); } }
4. 签名验证配置
将客户提供的X.509证书加载到应用中,用于验证IdP发送的SAML断言签名:
// 示例:从字符串证书创建X509Certificate对象 public X509Certificate loadCertificate(String certString) throws CertificateException { String cleanedCert = certString.replaceAll("-----BEGIN CERTIFICATE-----", "") .replaceAll("-----END CERTIFICATE-----", "") .replaceAll("\\s+", ""); byte[] certBytes = Base64.getDecoder().decode(cleanedCert); CertificateFactory factory = CertificateFactory.getInstance("X.509"); return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(certBytes)); }
四、测试与验证
- 针对单个客户(如C1),在其Okta租户中创建测试用户并分配应用权限
- 访问对应客户的登录入口
https://www.example.com/login/saml2/sso/c1,验证是否跳转到客户Okta登录页面 - 输入测试用户凭证,验证是否成功登录并进入应用,同时确认用户信息正确映射
- 测试注销流程,验证是否跳转到Okta注销页面后返回应用
五、核心疑问解答
- SAML断言:Okta作为IdP发送给你的应用(SP)的加密身份凭证,包含用户身份信息和数字签名,用于验证用户身份合法性
- ACS URL:应用接收IdP发送的SAML断言的端点,必须为HTTPS,确保传输安全
- Entity ID:SP与IdP之间的唯一标识,确保双方通信的是目标应用,避免混淆
- 多租户适配:通过为每个客户分配唯一
tenant-id,对应不同的ACS URL、Entity ID和Okta IdP配置,实现客户身份隔离
内容的提问来源于stack exchange,提问作者Mayank Sinha
相关产品推荐
相关产品推荐

