【发布时间】:2018-09-23 01:48:52
【问题描述】:
我有一个 R Shiny 应用程序,它根据当前登录的用户加载数据。特定的身份验证方法发生在上游,它在 HTTP 标头中转发用户 ID。
在 server.R 中,我将用户特定的数据作为反应数据对象提供,基本上是这样的:
available_data <- reactivePoll(
intervalMillis = 3600000, # one hour
session = session,
checkFunc = function() {
"" # don't bother invalidating ever
},
valueFunc = function() {
user_id <- fromJSON(as.list(session$request)$HTTP_SHINY_SERVER_CREDENTIALS)$user_id
if (user_id %in% authorized_users) {
return(get_data(user_id))
} else {
stop(safeError("Not authorized"))
}
}
)
然后我将available_data() 用于数据表、绘图等。这很好。
但是,当user_id 不是列表中的授权用户之一时,我会收到指定的红色错误消息来代替表格/绘图。未经授权的用户仍然可以看到所有导航、选项卡集、非反应性内容等。我宁愿做的只是抢占页面的所有呈现并将 403 状态代码返回给用户的浏览器。不过我找不到办法。
有没有办法在 Shiny 应用程序中引发异常,从而根本不呈现 UI?
【问题讨论】:
-
您可以拥有“空心 UI”而无需身份验证,但
session$request仅在server组件中可用。我建议您有两个选择:(1)使用shinyjs来隐藏/显示基于某些值的所有(重要)组件,尽管爱管闲事的用户仍然可以看到原始 HTML;或 (2) 仅在用户被授权后使用dynamic UI (uiOutput,insertUI,removeUI, ...) 填充ui组件。 (您会将大部分 ui 组件迁移到服务器条件中。) -
(注意选项 2:确保您真正控制反应性,否则您真的会搞砸用户体验。)
标签: r shiny shiny-server