shinyapp登陆认证功能的实现方式及示例

2018/03/04

Categories: R shiny Tags: cookie login auth

shiny-server可以方便实现交互式文档报告、web应用的开发,很快生成示例性的展示效果。但是基于开源的shiny-server并不支持用户认证,该功能在pro版本。在实际业务场景中由于数据的敏感性及重要程度都需要对每个应用有相关的认证功能并实现权限管理

1520129904988

shiny-server的权限管理

shiny-server的权限管理可以看作两个不同的方面:

shiny-server的应用端口为3838,那么直接对通过该端口的用户进行认证或者管理,实现方式:第三方认证工具auth0+nginx代理设置adding-authentication-to-shiny-server,应该也可以修改为自适的认证方式,需要nodejs配合实现。该方法的优点实现统一管理,所有shiny app由首页登陆实现统一管理,不足之处为每个shiny app分配不同权限比较麻烦

为具体的shiny app开发认证/权限管理,直接在shiny开发中实现不需要额外配置,问题是当shiny app太多管理也会比较混乱,有一套能直接套用的模版就用方便很多

本文针对第二种方式实现两类shiny app的认证/权限管理

基于单页面认证/权限管理

主要实现功能:

效果展示:

1520127231794

1520127324976

1520127379223

代码地址:single-page

关于登陆界面的样式还要做进一步调整,在此未细化

在shinydashboard包基础上实现dashboard模式的认证/权限管理

因为shinydashboard不能使用上述方法直接直接所有UI(dashboardHeader;dashboardSidebar;dashboardBody)作为整体使用uiOutput输出,只能将这三部分分别动态输出,这里使用shinyjs调整加载登陆页面、及加载后的页面,即在加载登陆页面时隐藏(dashboardHeader;dashboardSidebar),判断登陆成功再展示

# 登陆前
shinyjs::addClass(selector = "body", class = "sidebar-collapse")
shinyjs::removeClass(selector = "header", class = "main-header")
  
# 登陆成功
shinyjs::addClass(selector = "body", class = "sidebar-collapse")
shinyjs::removeClass(selector = "header", class = "main-header")

具体代码地址:dashboard-page

主要实现功能:

效果展示:

1520140261036

1520140286274

1520140206765