我有一个R Shiny应用程序,该应用程序根据当前登录的用户加载数据。特定的身份验证方法发生在上游,并在HTTP标头中转发用户ID。
在server.R中,我将用户特定的数据用作反应性数据对象,基本上是这样的:
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
没有一个时,我得到了指定的红色错误消息,代替了表/图。未经授权的用户仍会看到所有导航,选项卡集,非活动内容等。我更愿意做的是只是抢占该页面的所有呈现,并将403状态代码返回给用户的浏览器。我找不到解决办法。
有没有一种方法可以在Shiny应用程序中引发异常,从而完全不呈现UI?
我建议使用Shinyjs在所有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")
}
})
}
请注意%>% shinyjs::hidden
上述应用程序的UI部分中的。创建会话时以及在服务器中检查登录状态之前,此功能用于使用JavaScript隐藏logging.in.ui div中的所有UI。在服务器中观察到单选按钮的切换,并且login.in.ui div的UI内容根据登录状态显示或隐藏。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句