2015-09-18 11 views
6

Dopo aver provato la valutazione del server Riny Shiny Pro, non sono entusiasta del meccanismo di accesso/autenticazione in quanto non è un semplice meccanismo per gestire gli account utente per consentire ai client di accedere a un'app lucida.R hack login lucido

Come tale sto tentando di creare il mio meccanismo di login all'interno di Shiny che a tutti gli effetti funziona bene, a parte la visualizzazione di cose all'interno del framework shinydashboard. Le cose sembrano interrotte prima che venga visualizzato tutto il contenuto. Il mio codice di accesso è leggermente ammendato a https://gist.github.com/withr/9001831, quindi grazie mille.

Il mio codice:

require(shiny) 
require(shinydashboard) 

my_username <- "test" 
my_password <- "abc" 

header <- dashboardHeader(title = "my heading") 
sidebar <- uiOutput("sidebarpanel") 
body <- uiOutput("body") 

login <- box(title = "Login",textInput("userName", "Username"), 
      passwordInput("passwd", "Password"), 
      br(),actionButton("Login", "Log in")) 

mainpage <- "some data" 

ui <- dashboardPage(header, sidebar, body) 

server <- function(input, output, session) { 
    USER <<- reactiveValues(Logged = Logged) 

    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(my_username == Username) 
      Id.password <- which(my_password == 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) { 
     dashboardSidebar(
     sidebarUserPanel("myuser",subtitle = a(icon("user"), "Logout", href="__logout__")), 
     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")), 
      menuItem("Item 3", tabName = "t_item3", icon = icon("credit-card")), 
      menuItem("Item 4", tabName = "t_item4", icon = icon("share-alt")) 
     ))} 
    }) 

    output$body <- renderUI({ 
    if (USER$Logged == TRUE) { 
     dashboardBody(mainpage) 
    } 
    else { 
     dashboardBody(login) 
    } 
    }) 
} 

shinyApp(ui, server) 

Quando carico l'applicazione sembra che questo: Initial sceen capture

Se poi ridimensionare leggermente lo schermo si fissa. Resize screen capture

Ogni pensiero su come evitare il comportamento iniziale di strano sarebbe molto apprezzato ..

risposta

6

Penso che il problema può essere risolto mettendo la funzione dashboardSidebar e dashboardBody al di fuori della renderUI, proprio come:

header <- dashboardHeader(title = "my heading") 
sidebar <- dashboardSidebar(uiOutput("sidebarpanel")) 
body <- dashboardBody(uiOutput("body")) 

Verrà creata una barra laterale vuota e un corpo che in seguito è possibile compilare utilizzando la funzione renderUI.

Poiché si ha più componenti in "sidebarpanel" è possibile raggruppare poi sostituendo la funzione dashboardSidebar con una funzione div:

:

 output$sidebarpanel <- renderUI({ 
     if (USER$Logged == TRUE) { 
      div(
      sidebarUserPanel("myuser",subtitle = a(icon("user"), "Logout", href="__logout__")), 
      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")), 
       menuItem("Item 3", tabName = "t_item3", icon = icon("credit-card")), 
       menuItem("Item 4", tabName = "t_item4", icon = icon("share-alt")) 
      ) 
     ) 
     } 
     }) 

Rimuovere anche il dashboardBody dal "corpo" funzione render

output$body <- renderUI({ 
    if (USER$Logged == TRUE) { 
     mainpage 
    } 
    else { 
     login 
    } 
    }) 

Dovrebbe risolvere il problema.

A proposito, è sicuro utilizzare questo tipo di autenticazione di accesso?

+0

idem sulla domanda "è sicuro utilizzare questo tipo di autenticazione di accesso". Ho implementato qualcosa di simile, ma con sale e pepe per la password dell'utente, anche se non sono sicuro se questo potrebbe essere facilmente violato. Non esiste inoltre uno stato di accesso salvato, quindi se l'utente aggiorna lo schermo, sarà necessario accedere nuovamente. –

+0

FYI, non è sicuro usare questo genere di cose. Vorrei suggerire di aggiungere PAM sul tuo server lucido –

+0

Grazie per l'informazione. PAM sembra funzionare solo con la versione Pro di Shiny. C'è qualche altra alternativa sicura compatibile con la versione gratuita di Shiny? – Geovany