2015-09-18 4 views
6

die Bewertung des Pro Servers RStudio Shiny versucht zu haben als ihre nicht einfacher Mechanismus ist Benutzerkonten verwalten für die Kunden eine glänzende App zuzugreifen.R glänzend Login hackt

Als solche versuche ich meine eigene Login-Mechanismus innerhalb Shiny zu schaffen, die in jeder Hinsicht funktioniert ok, abgesehen von der Anzeige von Dingen innerhalb der shinydashboard Rahmen. Die Dinge scheinen abgeschnitten zu sein, bevor alle Inhalte angezeigt werden. Mein Login-Code ist eine leichte Verbesserung zu https://gist.github.com/withr/9001831, also vielen Dank dort.

Mein Code:

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) 

Wenn ich laden Sie die App es wie folgt aussieht: Initial sceen capture

Wenn ich dann den Bildschirm leicht ändern Sie die Größe selbst behebt. Resize screen capture

Irgendwelche Gedanken darüber, wie das seltsame Anfangsverhalten zu vermeiden, wäre sehr dankbar ..

Antwort

6

Ich denke, dass das Problem der dashboardSidebar und dashboardBody Funktion, indem sie außerhalb des renderUI befestigt werden kann, genau wie:

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

Erzeugt eine leere Seitenleiste und einen Körper, den Sie später mit der Funktion renderUI füllen können.

Da Sie mehrere Komponenten in „sidebarpanel“ haben, können Sie Gruppe dann durch die dashboardSidebar Funktion mit einer div Funktion ersetzen:

 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")) 
      ) 
     ) 
     } 
     }) 

Entfernen Sie auch die dashboardBody aus dem „Körper“ Render-Funktion:

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

Es sollte das Problem beheben.

Übrigens ist es sicher, diese Art von Login-Authentifizierung zu verwenden?

+0

dito auf die Frage "ist es sicher, diese Art von Login-Authentifizierung zu verwenden". Ich habe etwas Ähnliches implementiert, aber mit Salz und Pfeffer für das Passwort des Benutzers, obwohl ich nicht sicher bin, ob das leicht gehackt werden könnte. Es gibt auch keinen gespeicherten Anmeldestatus. Wenn der Benutzer den Bildschirm aktualisiert, muss er sich erneut anmelden. –

+0

FYI, es ist nicht sicher, diese Art von Sache zu verwenden. Ich würde vorschlagen, PAM auf Ihrem glänzenden Server hinzuzufügen –

+0

Danke für die Informationen. Es scheint, dass PAM nur mit der Pro-Version von Shiny funktioniert. Es gibt noch eine andere sichere Alternative, die mit der kostenlosen Version von Shiny kompatibel ist. – Geovany