如何根据用户权限显示/隐藏Flexdashboard标签页?
解决Flexdashboard基于shinymanager的角色权限控制问题
你的需求是让admin能访问两个标签页,manager仅能查看TAB A,原代码存在角色判断逻辑错误、固定用户角色、静态标签页显示隐藏控制方式不当等问题。以下是修正后的完整代码:
--- title: "Flexdashboard" output: flexdashboard::flex_dashboard runtime: shiny --- ```{css} .panel-auth { position: fixed; top:0; bottom: 0; left: 0; right: 0; background-color: #FFF; opacity: 1; z-index: 99997; overflow-x: hidden; overflow-y: scroll; }
library(flexdashboard) library(shiny) library(shinymanager) # 新增role字段,明确用户角色,比仅靠用户名判断更规范 credentials <- data.frame( user = c("admin", "manager"), password = c("1234", "1234"), role = c("admin", "manager"), # 新增角色列 stringsAsFactors = FALSE )
auth_ui(id = "auth") # 调用认证模块,获取用户登录信息 auth <- callModule( module = auth_server, id = "auth", check_credentials = check_credentials(credentials) ) # 反应式获取当前登录用户的角色 current_role <- reactive({ req(auth$user()) # 确保用户登录后才获取信息,避免空值错误 auth$user()$role })
TAB A
Chart
这里放置TAB A的内容,所有登录用户均可访问
# 示例图表,可替换为你的业务内容 renderPlot({ plot(rnorm(100)) })
# 动态渲染TAB B,仅admin角色可见 renderUI({ if(current_role() == "admin"){ tagList( h2("TAB B", style = "margin-top: 20px;"), hr(), h3("Chart"), renderPlot({ plot(runif(100)) }) ) } })
### 关键修改说明: - **新增角色字段**:在credentials数据框中添加`role`列,将用户与角色绑定,后续权限判断更直观,也便于扩展更多角色。 - **正确获取登录用户角色**:通过`current_role`反应式对象实时获取当前登录用户的角色,`req(auth$user())`确保仅在用户登录后执行后续逻辑。 - **动态生成TAB B**:由于flexdashboard的静态标签页无法直接通过反应式控制显示隐藏,因此使用`renderUI`动态生成TAB B内容,仅当当前角色为admin时才渲染该部分。 - **修正原逻辑错误**:原代码固定了`user_role = "manager"`且判断逻辑倒置,现在改为基于实际登录用户的角色进行权限判断。 内容的提问来源于stack exchange,提问作者ISMAIL AHMED
相关产品推荐
相关产品推荐

