如何通过GCP负载均衡实现Google Cloud Run应用SAML SSO自动跳转
实现SSO自动跳转的两种方案
方案1:GCP负载均衡配置(无需修改应用代码)
直接按下面步骤调整现有重定向规则即可解决配置失效问题:
- 规则优先级调整:新增2条重定向/转发规则,优先级设置为全局最高(数值填1、2,数值越小优先级越高)
- 第一条规则(拦截未登录请求):
- 匹配条件:主机填写你的应用域名,路径模式填写
/*,覆盖所有请求路径,HTTP方法全选 - 动作选择「302临时重定向」,目标地址为你的SSO登录URL,末尾拼接回调参数
?redirect_uri=https://<你的应用域名>{request_uri},自动携带用户原始访问地址用于登录后回跳
- 匹配条件:主机填写你的应用域名,路径模式填写
- 第二条规则(放行回调请求):
- 匹配条件:路径模式填写你的SAML回调路径(例如
/auth/saml/callback/*) - 动作选择「直接转发至Cloud Run后端服务」,避免回调请求被重定向造成死循环
- 匹配条件:路径模式填写你的SAML回调路径(例如
- 配置生效:保存后等待1-5分钟负载均衡规则同步,清除浏览器缓存后测试即可
方案2:R应用端代码实现(灵活度更高)
根据你使用的R Web框架选择对应实现逻辑即可:
针对Shiny应用
需提前安装shinyjs包,在应用启动逻辑中加身份校验跳转:
library(shiny) library(shinyjs) ui <- fluidPage( useShinyjs(), # 必须引入shinyjs组件 # 以下为你的原有UI代码 ) server <- function(input, output, session) { # 应用启动时优先校验登录状态 observe({ # 替换为你的实际登录态判断逻辑,例如校验cookie中的SAML token has_valid_token <- !is.null(session$request$cookies$saml_auth_token) if (!has_valid_token) { sso_login_url <- "https://你的SSO登录地址?redirect_uri=" # 拼接当前访问地址作为回调参数 current_access_url <- URLencode(paste0("https://", session$request$HTTP_HOST, session$request$PATH_INFO)) runjs(paste0("window.location.replace('", sso_login_url, current_access_url, "')")) } }) # 以下为你的原有业务逻辑代码 } shinyApp(ui, server)
针对Plumber应用
通过全局过滤器实现所有请求的身份校验拦截:
library(plumber) #* 全局身份校验过滤器 #* @filter auth_check function(req, res) { # 放行SAML回调路径,避免循环跳转 if (grepl("^/auth/saml/callback", req$PATH_INFO)) { return(forward()) } # 替换为你的实际登录态判断逻辑 has_valid_token <- !is.null(req$cookies$saml_auth_token) if (!has_valid_token) { sso_login_url <- "https://你的SSO登录地址" current_access_url <- URLencode(paste0("https://", req$HTTP_HOST, req$PATH_INFO)) res$status <- 302 res$setHeader("Location", paste0(sso_login_url, "?redirect_uri=", current_access_url)) return(list()) } forward() } # 以下为你的原有接口/业务代码
内容的提问来源于stack exchange,提问作者Aniruddha Sengupta
相关产品推荐
相关产品推荐

