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

求助:Spring Web应用集成ADFS方案咨询(含Spring Security)

集成ADFS到基于Spring Security的Web应用

嘿,刚好我之前帮客户做过类似的ADFS集成,给你梳理下关键步骤和踩过的坑,应该能帮你快速落地:

1. 引入必要依赖

如果是Spring Boot项目,直接在pom.xml里添加Spring Security SAML2的依赖(Gradle用户对应调整即可):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-saml2-service-provider</artifactId>
</dependency>

2. 配置ADFS元数据与基础参数

首先得从客户的ADFS管理员那里拿到两个关键信息:

  • ADFS的元数据URL(通常是https://<adfs-domain>/FederationMetadata/2007-06/FederationMetadata.xml)
  • 为你的应用分配的信赖方实体ID

然后在application.yml里配置这些基础参数:

spring:
  security:
    saml2:
      relyingparty:
        registration:
          adfs: # 自定义的注册ID,后续配置会用到
            entity-id: "你的应用实体ID"
            identityprovider:
              entity-id: "ADFS的实体ID(从元数据里可以找到)"
              singlesignon:
                url: "ADFS的SSO地址(元数据里的SingleSignOnService Location)"
              metadata-uri: "ADFS的元数据URL"

3. 编写Spring Security配置类

接下来要配置SecurityFilterChain,启用SAML2登录,并指定哪些路径需要认证:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().authenticated()
            )
            .saml2Login(saml2 -> saml2
                .registrationId("adfs") // 对应yml里的注册ID
                .successHandler((request, response, authentication) -> {
                    // 认证成功后的自定义逻辑,比如跳转首页、记录日志等
                    response.sendRedirect("/");
                })
            );
        return http.build();
    }
}

4. 映射ADFS用户信息到Spring Security

ADFS返回的SAML断言里会包含用户的属性(比如邮箱、姓名、部门等),如果你需要把这些属性映射到Spring Security的UserDetails对象里,可以自定义一个Saml2AuthenticatedPrincipalConverter:

import org.springframework.core.convert.converter.Converter;
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

@Component
public class ADFSUserConverter implements Converter<Saml2AuthenticatedPrincipal, UserDetails> {

    @Override
    public UserDetails convert(Saml2AuthenticatedPrincipal principal) {
        // 从ADFS断言里获取用户属性,比如email、name
        String email = principal.getFirstAttribute("email");
        String name = principal.getFirstAttribute("displayName");
        
        // 这里可以根据实际需求配置权限,也可以从ADFS属性里获取角色
        return User.withUsername(email)
            .password("") // ADFS认证不需要本地密码,填空即可
            .roles("USER")
            .build();
    }
}

然后在Security配置里注册这个转换器:

// 在SecurityConfig的securityFilterChain方法里添加
.saml2Login(saml2 -> saml2
    .registrationId("adfs")
    .principalConverter(new ADFSUserConverter()) // 加入自定义转换器
    .successHandler(...)
)

5. 关键注意事项(踩坑总结)

  • ADFS信赖方配置:一定要让客户的ADFS管理员把你的应用配置为信赖方,并且确保回调URL是{你的应用域名}/login/saml2/sso/adfs(这里的adfs是你yml里的注册ID),实体ID要和你配置的完全一致。
  • 证书信任:ADFS的元数据里包含签名证书,你的应用需要信任这个证书。如果是测试环境可以临时关闭证书验证(不建议生产用),生产环境要把ADFS的证书导入到应用的信任存储里。
  • 调试日志:如果遇到认证失败,开启Spring Security的DEBUG日志,查看SAML请求和响应的细节,能快速定位问题:
logging:
  level:
    org.springframework.security: DEBUG
    org.springframework.security.saml2: DEBUG

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:01:47