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

Jenkins中禁用SSO用户:已登录离职员工访问权限拦截方案咨询

Azure AD集成Jenkins场景下已登录离职用户即时拦截方案

出现该问题的核心原因是:默认Jenkins的SSO相关插件仅在用户登录环节校验Azure AD账号状态,会话生效期间不会主动同步AAD侧的账号状态变更,因此账号禁用后已登录用户的会话仍处于有效状态。

可通过以下3种方案实现即时拦截,可根据自身场景选择:

方案1:缩短会话有效期,降低权限泄露窗口

  • 调整Jenkins全局会话超时时间,设置为15~60分钟的短周期,会话到期后用户必须重新走AAD鉴权流程,此时已禁用的账号会被直接拦截。
  • 配置路径:进入Jenkins【Manage Jenkins】-【Configure Global Security】,找到Session Management模块,设置Session timeout参数即可。如果使用官方Azure AD插件,也可以在OIDC配置项中绑定id_token有效期,会话将和token时效保持一致。
  • 优势:无需额外开发,配置成本极低;劣势:无法实现完全即时的拦截,最长存在等于会话时长的权限窗口期。

方案2:配置请求级AAD状态校验,实现实时拦截

  • 安装Script Security插件,编写全局前置拦截脚本,每次用户发起访问请求时,调用Microsoft Graph API校验当前登录用户的AAD账号状态,若账号已被禁用/删除,直接销毁当前会话并拒绝访问。
    核心参考代码:
import jenkins.model.Jenkins
import hudson.security.AccessDeniedException
import javax.servlet.http.HttpServletRequest

def currentUser = User.current()
if (currentUser != null) {
    // 获取当前用户绑定的AAD用户ID
    def aadUserId = currentUser.getProperty(com.microsoft.jenkins.azuread.AzureAdUserProperty.class)?.getObjectId()
    if (aadUserId) {
        // 调用Graph API查询账号状态,可搭配本地缓存降低接口调用频率
        def accountEnabled = graphClient.users(aadUserId).buildRequest().get().accountEnabled
        if (!accountEnabled) {
            // 销毁当前用户会话
            Jenkins.instance.getSecurityRealm().logout((HttpServletRequest) Jenkins.instance().servletContext.getAttribute("request"))
            throw new AccessDeniedException("账号已禁用,访问被终止")
        }
    }
}
  • 优势:可实现完全实时的权限拦截;劣势:会增加每次请求的响应耗时,建议搭配1~2分钟的本地状态缓存,避免频繁调用Graph API产生性能损耗。

方案3:离职流程新增Jenkins会话销毁步骤

  • 员工离职操作时,除了禁用AAD账号之外,主动调用Jenkins API销毁该用户的所有活跃会话,实现即时拦截。
  • 操作方式:
    • 手动操作:进入Jenkins用户管理页,找到对应用户的详情页,点击【结束所有会话】按钮即可。
    • 自动化操作:使用管理员权限的账号调用Jenkins API POST /user/{对应用户名}/logoutAll,可直接集成到现有离职自动化流程中。
  • 优势:无性能损耗,即时生效,配置成本低;劣势:依赖离职流程的联动适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:54:04