Return R Shiny 应用程序中的 HTTP 状态代码
Return HTTP status codes in R Shiny application
我有一个 R Shiny 应用程序,它根据当前 logged-in 用户加载数据。特定的身份验证方法发生在上游,它在 HTTP headers.
中转发用户 ID
在server.R中,我将user-specific数据作为反应数据object提供,基本上是这样的:
available_data <- reactivePoll(
intervalMillis = 3600000, # one hour
session = session,
checkFunc = function() {
"" # don't bother invalidating ever
},
valueFunc = function() {
user_id <- fromJSON(as.list(session$request)$HTTP_SHINY_SERVER_CREDENTIALS)$user_id
if (user_id %in% authorized_users) {
return(get_data(user_id))
} else {
stop(safeError("Not authorized"))
}
}
)
然后我用available_data()
做数据表、绘图等。这很好。
当 user_id
不是 列表中的授权用户时,我得到指定的红色错误消息代替 table/plot.未经授权的用户仍然可以看到所有的导航、标签集、non-reactive 内容等。我宁愿做的只是抢占页面的所有呈现和 return 用户浏览器的 403 状态代码。不过我找不到办法做到这一点。
有没有办法在 Shiny 应用程序中引发异常,从而根本不呈现 UI?
我建议使用 shinyjs 启动会话并隐藏所有 UI,然后仅当授权用户建立连接时才显示 UI。
例如,以下应用仅向登录用户显示 UI。我将授权状态替换为单选按钮以简化示例,但逻辑是相同的。
# ui.R
fluidPage(
useShinyjs(),
h1("User Authentication Example"),
radioButtons("login", "Login:", c("Logged out", "Logged in")),
div(id = "logged.in.ui",
p("You are logged in")
) %>% shinyjs::hidden()
)
# server.R
library(shinyjs)
function(input, output) {
# Showing/hiding UI depending on login status.
observeEvent(input$login, {
if (input$login == "Logged in") {
shinyjs::show("logged.in.ui")
} else {
shinyjs::hide("logged.in.ui")
}
})
}
请注意上述应用的 UI 部分中的 %>% shinyjs::hidden
。此函数用于在创建会话时和在服务器中检查登录状态之前使用 JavaScript 隐藏 logged.in.ui div 中的所有 UI。在服务器中观察到切换单选按钮,logged.in.ui div 的 UI 内容根据登录状态显示或隐藏。
我有一个 R Shiny 应用程序,它根据当前 logged-in 用户加载数据。特定的身份验证方法发生在上游,它在 HTTP headers.
中转发用户 ID在server.R中,我将user-specific数据作为反应数据object提供,基本上是这样的:
available_data <- reactivePoll(
intervalMillis = 3600000, # one hour
session = session,
checkFunc = function() {
"" # don't bother invalidating ever
},
valueFunc = function() {
user_id <- fromJSON(as.list(session$request)$HTTP_SHINY_SERVER_CREDENTIALS)$user_id
if (user_id %in% authorized_users) {
return(get_data(user_id))
} else {
stop(safeError("Not authorized"))
}
}
)
然后我用available_data()
做数据表、绘图等。这很好。
当 user_id
不是 列表中的授权用户时,我得到指定的红色错误消息代替 table/plot.未经授权的用户仍然可以看到所有的导航、标签集、non-reactive 内容等。我宁愿做的只是抢占页面的所有呈现和 return 用户浏览器的 403 状态代码。不过我找不到办法做到这一点。
有没有办法在 Shiny 应用程序中引发异常,从而根本不呈现 UI?
我建议使用 shinyjs 启动会话并隐藏所有 UI,然后仅当授权用户建立连接时才显示 UI。
例如,以下应用仅向登录用户显示 UI。我将授权状态替换为单选按钮以简化示例,但逻辑是相同的。
# ui.R
fluidPage(
useShinyjs(),
h1("User Authentication Example"),
radioButtons("login", "Login:", c("Logged out", "Logged in")),
div(id = "logged.in.ui",
p("You are logged in")
) %>% shinyjs::hidden()
)
# server.R
library(shinyjs)
function(input, output) {
# Showing/hiding UI depending on login status.
observeEvent(input$login, {
if (input$login == "Logged in") {
shinyjs::show("logged.in.ui")
} else {
shinyjs::hide("logged.in.ui")
}
})
}
请注意上述应用的 UI 部分中的 %>% shinyjs::hidden
。此函数用于在创建会话时和在服务器中检查登录状态之前使用 JavaScript 隐藏 logged.in.ui div 中的所有 UI。在服务器中观察到切换单选按钮,logged.in.ui div 的 UI 内容根据登录状态显示或隐藏。