You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据用户权限显示/隐藏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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:11:29