我正在构建一个闪亮的仪表板来显示大量的数据。人们通过位于前面的单独的登录页面(不闪亮)访问仪表板,此时生成一个JWT并放入cookie中。我成功地读取了闪亮的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
。
我想,在JS抓取和返回cookie之前,整个ui
都会被执行。解决这个问题最好的办法是什么?
或者,也许我走错路了。显然,我需要验证cookie服务器端(即R
中的cookie服务器端),以避免泄露秘密;最好是这一检查,隐藏/显示是在闪亮的应用程序一开始就完成的(会话期间userPermissions
不会更改)。也许有一个不同的(&更好的)解决方案来达到这一点?
任何帮助都是非常感谢的!
发布于 2020-07-10 09:16:10
最后,我发现appendTab
函数做的正是我想要的。但是,这需要在server.R
中运行,在函数中查找cookie (否则userPermissions
实际上不存在)。我可以这样做:
appendTab("navbar" # the id of the navigation bar created in ui.R
,tabPanel("tab name"
,mainPanel(...))
)
tabPanel(...)
可能是你通常在ui.R
里放的任何东西。
这里的另一个好处是隐藏的选项卡在HTML源代码中也不可用,因为它们从未从服务器传递到客户端!
https://stackoverflow.com/questions/61506372
复制相似问题