问题描述
我想运行多个本地Shiny应用程序,而用户不能打开其他用户的Shiny应用程序(我们称其为“应用程序劫持”)。
这些是我的约束:
- 我暂时无法使用Shiny Server(开源)或Shiny Server Pro。
- 与正常的预期行为不同,用户应该无法访问彼此的应用程序
- Shiny应用程序需要在共享的(windows)服务器上运行,在该服务器上,每个用户都在各自分配的端口上启动自己的Shiny app / R进程(出于性能和每个用户对数据库的访问不同的原因)。
- 该应用需要为少数几个用户(10-20)运行。
- 每个用户自己启动服务器时,应用代码对用户“公开”。
- 如果下面的方法可以安全使用,我不想使用传统的身份验证(用户名/密码),因为它必须实现和维护。
问题: 我必须以一种用户无法打开其他应用程序的方式来进行身份验证,因为他们可以通过尝试其他端口(例如127.0.0.1:5000、5001、5002等)来随机打开其他localhost应用程序。这很重要,因为否则用户可以使用其他用户的数据库访问权限来查询数据。
我的解决方法: 给定ShinyServer(func)-根据Shiny documentation-
我的想法是,如果ShinyServer(func)不是第一次运行,则调用 stopApp(func)(因此,任何调用> 1)。这样,如果一个用户打开另一个用户的应用程序,它将基本上破坏自身并需要重新启动。因此,我正在定义一个全局变量“ runNumber”,并在服务器函数中对其进行递增。如果变量大于1,我将终止该应用程序。
我愿意接受这样的事实:如果会话被终止,这对任何用户来说都不方便。另外,用户不能使用浏览器的刷新按钮或使用同一应用程序打开另一个选项卡。
实现是这样的(您可以按原样复制和运行代码):
runNumberGlobal <- 1
library(shiny)
ui <- fluidPage(
# Application title
titlePanel("Mayfly App"),tags$h1("App run number:"),tags$h1(textoutput("runNumber_out"))
)
server <- function(input,output) {
runNumber <- runNumberGlobal
output$runNumber_out <- renderText({runNumber})
if(runNumber > 1) {
stopApp()
}
runNumberGlobal <<- runNumber + 1
}
shinyApp(ui = ui,server = server)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)