【问题标题】:Return HTTP status codes in R Shiny application在 R Shiny 应用程序中返回 HTTP 状态代码
【发布时间】:2018-09-23 01:48:52
【问题描述】:

我有一个 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?

【问题讨论】:

  • 您可以拥有“空心 UI”而无需身份验证,但 session$request 仅在 server 组件中可用。我建议您有两个选择:(1)使用shinyjs 来隐藏/显示基于某些值的所有(重要)组件,尽管爱管闲事的用户仍然可以看到原始 HTML;或 (2) 仅在用户被授权后使用dynamic UI (uiOutput, insertUI, removeUI, ...) 填充ui 组件。 (您会将大部分 ui 组件迁移到服务器条件中。)
  • (注意选项 2:确保您真正控制反应性,否则您真的会搞砸用户体验。)

标签: r shiny shiny-server


【解决方案1】:

我建议使用 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 部分中的 %&gt;% shinyjs::hidden。此功能用于在创建会话时和在服务器中检查登录状态之前使用 JavaScript 隐藏 login.in.ui div 中的所有 UI。在服务器中观察到切换单选按钮,logged.in.ui div 的 UI 内容根据登录状态显示或隐藏。

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2018-03-28
    • 2017-05-21
    • 2016-12-18
    相关资源
    最近更新 更多