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
相关产品推荐
相关产品推荐

