在本地为单个用户运行Shiny应用程序时使用单独的R进程防止“应用程序劫持”

问题描述

我想运行多个本地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-

”“当每个客户端(网络浏览器)首次加载Shiny应用程序的页面时将被调用

我的想法是,如果ShinyServer(func)不是第一次运行,则调用 stopApp(func)(因此,任何调用> 1)。这样,如果一个用户打开另一个用户的应用程序,它将基本上破坏自身并需要重新启动。因此,我正在定义一个全局变量“ runNumber”,并在服务器函数中对其进行递增。如果变量大于1,我将终止该应用程序。

  • 以明智的方式使用这种方法是否安全?或者用户可以用这种方法来减轻压力吗?
  • 用户是否可以在不运行应用程序的情况下以某种方式更改全局变量并将其设置回0?

我愿意接受这样的事实:如果会话被终止,这对任何用户来说都不方便。另外,用户不能使用浏览器的刷新按钮或使用同一应用程序打开另一个选项卡。

实现是这样的(您可以按原样复制和运行代码):

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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...