基于shinymanager实现Shiny应用访客登录认证的问题咨询
问题排查
你代码存在两个核心错误导致点击按钮无响应:
- 输入ID拼写错误:你给访客按钮定义的ID是
login_guest,但观察者监听的是input$login_gast,ID不匹配导致点击事件完全不会触发 secure_server是全局唯一的鉴权实例,不能在观察者内部重复调用,该写法不符合shinymanager的鉴权逻辑,无法完成登录状态写入
可直接运行的实现方案
用shinyjs模拟填充访客账号密码并触发原生登录动作,无需修改shinymanager底层逻辑,同时支持后续基于访客身份做权限控制:
library(shiny) library(shinymanager) library(shinyjs) # 定义账号凭证 credentials <- data.frame( user = c("user1", "user2", "guest"), password = c("user1", "user2", "guest"), admin = c(TRUE, FALSE, FALSE), stringsAsFactors = FALSE ) # 定义应用UI ui <- fluidPage( tags$h2("My secure application"), verbatimTextOutput("auth_output") ) # 封装鉴权UI,引入shinyjs能力 ui <- secure_app( ui = ui, head_content = tags$head(useShinyjs()), tags_top = tags$p(actionButton(inputId = "login_guest", label = "Continue as guest")) ) # 定义服务端逻辑 server <- function(input, output, session) { # 访客登录触发逻辑 observeEvent(input$login_guest, { # 自动填充访客账号密码 updateTextInput(session, "auth-user_id", value = "guest") updateTextInput(session, "auth-user_pwd", value = "guest") # 触发shinymanager原生登录按钮点击事件 click("auth-go_auth") }) # 全局唯一鉴权实例 res_auth <- secure_server( check_credentials = check_credentials(credentials) ) # 打印当前登录用户信息 output$auth_output <- renderPrint({ reactiveValuesToList(res_auth) }) } shinyApp(ui, server)
后续如果要限制访客仅访问基础功能,只需要在服务端判断res_auth$user == "guest",按需隐藏/禁用高级功能模块即可,无需引入额外的权限管理包。
内容的提问来源于stack exchange,提问作者Floris Roelofs
相关产品推荐
相关产品推荐

