【发布时间】:2020-04-29 16:09:38
【问题描述】:
我正在构建一个闪亮的仪表板来显示大量数据。人们通过位于前面的单独登录页面(非 Shiny)访问仪表板,此时生成 JWT 并将其放入 cookie。我已经设法在 Shiny 中读取 cookie 并解析数据,将令牌保存在一个名为 userPermissions 的变量中。但是,现在我想根据用户权限在仪表板中显示/隐藏选项卡。
例如:我有关于经理和助理的数据。我想向使用userPermissions == 'manager' 的任何用户显示经理数据,向使用userPermissions == assistant 的任何用户显示助理数据。
我认为最好的方法是使用conditionalPanel() - 这是一个(简化的)可重现示例:
library(shiny)
# UI file
ui <- fluidPage(
# JS to read cookie -- simplified to just return value!
tags$head(tags$script(
HTML('
Shiny.addCustomMessageHandler("goReadTheCookie", function (message) {
Shiny.onInputChange("cookie", "manager");
})
')
)
# Title
,titlePanel('Test')
# Navbar
,navbarPage(
id="navbar"
,conditionalPanel(condition = "userPermissions() == 'manager'",
mainPanel(textOutput('Manager data')))
,conditionalPanel(condition = "userPermissions() == 'assistant'",
mainPanel(textOutput('Assistant data')))
)
))
# Server file
server <- shinyServer(function(input, output,session){
## Grab permissions from Cookie
# Prepare output
userPermissions <- reactiveVal("")
# Tell JS to return cookie
session$sendCustomMessage(type="goReadTheCookie", message=list(name="cookie_name"))
# Listen for cookie
observeEvent(input$cookie,{
## -- Bunch of code omitted for sake of brevity -- ##
userPermissions("manager")
})
})
# Run app
shinyApp(ui=ui, server=server)
此代码的问题在于,在浏览器控制台中,我收到错误 Can't find variable: userPermissions。
我猜这里发生的事情是整个 ui 被执行,在 JS 可以抓取并返回 cookie 之前。解决这个问题的最佳方法是什么?
或者,也许我用错了方法。我显然需要验证 cookie 服务器端(即在R 中)不要泄露秘密;最好是这个检查,隐藏/显示在 Shiny 应用程序的一开始就完成了(userPermissions 在会话期间不会改变)。也许有一个不同的(和更好的)解决方案可以达到这一点?
任何帮助将不胜感激!
【问题讨论】:
-
这还取决于您希望这些面板对其他用户“隐藏”的安全程度。如果确定未经许可的用户可以简单地在 chrome 控制台中关闭
display:none并仍然查看内容