只需要登录Shiny app的一个部分

时间:2017-10-04 16:07:47

标签: r authentication shiny shiny-server

我有一个Shiny应用程序,其中主应用程序页面需要公开,但下载数据文件将需要通过登录进行身份验证。理想情况下,用户可以选择下载参数(他们想要包含的变量等),并且在他们实际点击“下载”按钮之前不会要求他们登录。

我在此主题上看到的每个问题都讨论了如何根据登录凭据制作不同的应用程序版本,但这些都需要初始登录,因此它们不适用。

我的想法是创建两个单独的应用程序,“下载”按钮链接到第二个应用程序。但是,这需要“记住”在第一个应用程序中输入的下载请求输入。 This question类似,但我没有使用Rmarkdown。

我所看到的解决如何链接Shiny应用程序的问题通常得出结论,您应该将源代码分开并从另一个文件中调用所有内容(使其成为单个应用程序),但shinyapps.io应用程序只能require authentication在整个应用程序的级别,所以组合它们将无法正常工作。

所以我想我正在寻找以下任一选项的建议:

1)将身份验证限制在应用的一个部分。现在,我可能的开源Shiny服务器授权工具(尚未设置)将是auth0,但如果使用Shiny Server Pro进行部分身份验证,那么我的组织可能愿意升级到Pro。

2)从一个应用程序(下载参数)向另一个应用程序(请求登录信息,然后返回下载文件)提供输入。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以自己编写登录逻辑。以下是renderUI如何完成此操作的简单说明。

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("public area", "Eveyone can see this!"),
    tabPanel("login area", uiOutput("login_area"))
  )
)

server <- function(input, output, session){
  logged_in = reactiveVal(FALSE)

  output$logged_in <- renderUI({"you are logged in"})

  output$not_logged_in <- renderUI({
    tagList(
      "you are not logged in",
      actionButton("login", "Log me in!")
    )
  })

  observeEvent(input$login, logged_in(TRUE))

  output$login_area <- renderUI({
    if (logged_in())
      uiOutput("logged_in")
    else
      uiOutput("not_logged_in")
  })
}

shinyApp(ui, server)