我正在尝试在我找到的代码段(https://github.com/treysp/shiny_password)中包含一个闪亮的仪表板,该代码段在功能中包含一个闪亮的应用程序以设置用户身份验证。
这个片段与fluidPage()完美配合,但我注意到当我包装dhasboardPage()时它无效:我尝试登录,输入我的用户名和密码,点击登录然后没有任何反应,我被困在登录页面上。控制台中没有错误消息我通过调用runApp()
来启动服务器您是否知道可能导致此特定问题的原因?
提前致谢
答案 0 :(得分:5)
这是一个开始的工作示例。这是一个非常基本的实现。
在测试用例中,存储的密码是可见的。您不希望以这种方式进行身份验证。这是不安全的。您需要找到一种方法来散列密码和匹配。惠东天github link
我在ui.r
中实施了大部分server.r
代码。不确定是否有解决方法。我注意到的缺点是代码行太多。将每个边标签分成单独的文件会很好。我自己没试过。但是,@ Dean Attali是split code
<强> ui.r 强>
require(shiny)
require(shinydashboard)
header <- dashboardHeader(title = "my heading")
sidebar <- dashboardSidebar(uiOutput("sidebarpanel"))
body <- dashboardBody(uiOutput("body"))
ui <- dashboardPage(header, sidebar, body)
<强> server.r 强>
login_details <- data.frame(user = c("sam", "pam", "ron"),
pswd = c("123", "123", "123"))
login <- box(
title = "Login",
textInput("userName", "Username"),
passwordInput("passwd", "Password"),
br(),
actionButton("Login", "Log in")
)
server <- function(input, output, session) {
# To logout back to login page
login.page = paste(
isolate(session$clientData$url_protocol),
"//",
isolate(session$clientData$url_hostname),
":",
isolate(session$clientData$url_port),
sep = ""
)
histdata <- rnorm(500)
USER <- reactiveValues(Logged = F)
observe({
if (USER$Logged == FALSE) {
if (!is.null(input$Login)) {
if (input$Login > 0) {
Username <- isolate(input$userName)
Password <- isolate(input$passwd)
Id.username <- which(login_details$user %in% Username)
Id.password <- which(login_details$pswd %in% Password)
if (length(Id.username) > 0 & length(Id.password) > 0){
if (Id.username == Id.password) {
USER$Logged <- TRUE
}
}
}
}
}
})
output$sidebarpanel <- renderUI({
if (USER$Logged == TRUE) {
div(
sidebarUserPanel(
isolate(input$userName),
subtitle = a(icon("usr"), "Logout", href = login.page)
),
selectInput(
"in_var",
"myvar",
multiple = FALSE,
choices = c("option 1", "option 2")
),
sidebarMenu(
menuItem(
"Item 1",
tabName = "t_item1",
icon = icon("line-chart")
),
menuItem("Item 2",
tabName = "t_item2",
icon = icon("dollar"))
)
)
}
})
output$body <- renderUI({
if (USER$Logged == TRUE) {
tabItems(
# First tab content
tabItem(tabName = "t_item1",
fluidRow(
output$plot1 <- renderPlot({
data <- histdata[seq_len(input$slider)]
hist(data)
}, height = 300, width = 300) ,
box(
title = "Controls",
sliderInput("slider", "observations:", 1, 100, 50)
)
)),
# Second tab content
tabItem(
tabName = "t_item2",
fluidRow(
output$table1 <- renderDataTable({
iris
}),
box(
title = "Controls",
sliderInput("slider", "observations:", 1, 100, 50)
)
)
)
)
} else {
login
}
})
}
答案 1 :(得分:2)
我最近写了一个R包,其中提供了可以与Shinydashboard集成的登录/注销模块。
软件包仓库中的inst/
目录包含示例应用程序的代码。
答案 2 :(得分:0)
@ user5249203的答案非常有用,但是由于密码相同,因此会产生一个(不间断的)信息。
textStorage
更好(或更简单)的解决方案可能是在以下位置替换6行:
Warning in if (Id.username == Id.password) { :
the condition has length > 1 and only the first element will be used
使用
Password <- isolate(input$passwd)