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

基于Spring Security与ADFS SAML2:如何刷新Claims或踢出用户

Spring Security + ADFS SAML2 动态权限与会话管理解决方案

1. 编程式重新加载用户Claims(无需重新认证)

Spring Security没有原生支持自动刷新SAML2 Claims,但可以通过两种方案实现无需用户重新认证的权限同步:

  • 自定义AuthenticationProvider:扩展Saml2AuthenticationProvider,在每次请求校验身份时主动调用ADFS的用户信息端点(如ADFS的/adfs/userinfo)拉取最新Claims,更新当前认证对象的权限:
public class RefreshableSaml2AuthenticationProvider extends Saml2AuthenticationProvider {
    private final AdfsUserInfoClient adfsUserInfoClient;

    public RefreshableSaml2AuthenticationProvider(AdfsUserInfoClient adfsUserInfoClient) {
        this.adfsUserInfoClient = adfsUserInfoClient;
    }

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        Saml2Authentication samlAuth = (Saml2Authentication) super.authenticate(authentication);
        // 调用ADFS接口获取最新用户Claims
        Map<String, Object> updatedClaims = adfsUserInfoClient.fetchLatestClaims(samlAuth.getName());
        // 转换Claims为应用权限
        Collection<? extends GrantedAuthority> newAuthorities = convertClaimsToAuthorities(updatedClaims);
        // 返回更新后的认证对象
        return new Saml2Authentication(samlAuth.getSaml2Response(), samlAuth.getPrincipal(), newAuthorities);
    }

    private Collection<? extends GrantedAuthority> convertClaimsToAuthorities(Map<String, Object> claims) {
        // 自定义Claims转权限的逻辑
        return claims.getOrDefault("roles", Collections.emptyList())
                .stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toList());
    }
}
  • 请求拦截器定期刷新:添加自定义Filter,在用户会话有效期内每隔固定时间(如30分钟)触发Claims刷新,更新SecurityContext中的认证信息。注意控制刷新频率,避免过度调用ADFS接口。

注:以上方案依赖ADFS开放用户信息查询接口,需确保应用拥有对应的访问权限。

2. ADFS会话失效与强制踢人机制

ADFS支持以下方式处理用户删除或权限变更后的会话失效:

  • 主动注销ADFS会话:通过ADFS PowerShell命令强制注销指定用户的SSO会话,用户下次访问应用时需重新认证:
Revoke-AdfsTrustToken -TargetName "user@domain.com"
  • 应用端会话超时控制:在Spring Security中配置较短的会话有效期,结合Claims刷新机制,让用户会话到期后自动重新认证,间接实现权限同步:
spring:
  security:
    session:
      timeout: 30m
      tracking-modes: cookie
  • ADFS推送式Claims更新:ADFS支持通过WS-Federation通知机制或SAML2 Artifact Resolution推送Claims变更,但配置复杂,需ADFS管理员配合开启相关功能。

动态权限处理最佳实践

  • 分层权限校验:不要完全依赖ADFS Claims做实时校验,应用内部维护权限缓存的同时,在敏感操作(如访问核心接口)时主动调用AD/ADFS API校验最新权限。
  • 会话生命周期协同:对齐ADFS会话超时与应用端会话超时时间,平衡用户体验与权限同步及时性。
  • 全局注销流程:提供统一注销入口,调用ADFS注销端点(/adfs/ls/?wa=wsignout1.0)的同时销毁应用端会话,确保用户完全退出。
  • 监控告警:监控ADFS会话状态与应用权限校验失败事件,当用户权限变更或被删除时及时触发告警与处理流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:42:53