2015-11-19 2 views
3

В системе, которую я разрабатываю, у меня есть 3 разных участника (пользователь, администратор, группа поддержки) с помощью приложения Shiny. Я хочу знать, как я могу дать аутентификацию этим трем актерам, чтобы каждый из этих актеров имел доступ только к своей странице. Я обнаружил, что это возможно с помощью блестящего сервера Pro, который не является бесплатным. Есть ли способ сделать это, а не использовать блестящий сервер pro. В UI.R код являются следующие:Аутентификация в блестящем приложении и нескольких страницах

library(shiny) 
library(shinydashboard) 
rm(list = ls()) 


Logged = FALSE; 
my_username <- "test" 
my_password <- "test" 

ui1 <- dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(


    box(




    ui = (htmlOutput("page")) 

    ) 
) 
) 

В Server.R коды являются следующие: библиотеки (shinydashboard)

библиотеки (блестящие)

server = (function(input, output,session) { 

    ui1 <- function(){ 
    tagList(
     div(id = "login", 
      wellPanel(textInput("userName", "Username"), 
        passwordInput("passwd", "Password"), 
        br(),actionButton("Login", "Log in"))), 
     tags$style(type="text/css", "#login {font-size:10px; text-align: left;position:absolute;top: 40%;left: 50%;margin-top: -100px;margin-left: -150px;}") 
    )} 

    ui2 <- function(){tagList(tabPanel("Test"))} 
    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 
      } 
      } 
     } 
     } 
    }  
    }) 
    observe({ 
    if (USER$Logged == FALSE) { 

     output$page <- renderUI({ 
     div(class="outer",do.call(bootstrapPage,c("",ui1()))) 
     }) 
    } 
    if (USER$Logged == TRUE) 
    { 
     output$page <- renderUI({ 
     div(class="outer",do.call(navbarPage,c(inverse=TRUE,title = "Contratulations you got in!",ui2()))) 
     }) 
     print(ui) 
    } 
    }) 
}) 

Я хотите перейти на другую страницу, которая только аутентифицирована для пользователя. Как я могу подключить UI.R к разным страницам в блестящем приложении? (Например, покажите страницу USER.R).

+0

Я хочу иметь несколько файлов и страницу, вместо того, чтобы писать все команды в ui.r и server.r – user

+0

Я думаю, что вы можете создавать различные r файл со списком необходимых элементов пользовательского интерфейса, а затем использовать источник в этих файлах в if-else 'output $ page <- renderUI ({if (user.role ==" user ") source (user.r) list_from_source }) ' – Batanichek

+0

не могли бы вы дать простой пример, что я могу попробовать? – user

ответ

4

Попробуйте такие я думаю, что это может помочь сделать то, что вы хотите

1) УИ:

library(shiny) 
library(shinydashboard) 
shinyUI( 
    dashboardPage(
    dashboardHeader(), 
    dashboardSidebar(), 
    dashboardBody(

     uiOutput("page") 

    ) 
) 

) 

2) Сервер:

library(shiny) 
    library(shinydashboard) 
    source("user.R") 
    source("admin.R") 

    my_username <- c("test","admin") 
    my_password <- c("test","123") 
    get_role=function(user){ 
     if(user=="test") { 
     return("TEST") 
     }else{ 
     return("ADMIN") 
     } 
    } 

    get_ui=function(role){ 
     if(role=="TEST"){ 
     return(list_field_user) 
     }else{ 
     return(list_field_admin) 
     } 
    } 


    shinyServer(function(input, output,session) { 

     USER <- reactiveValues(Logged = FALSE,role=NULL) 

     ui1 <- function(){ 
     tagList(
      div(id = "login", 
       wellPanel(textInput("userName", "Username"), 
         passwordInput("passwd", "Password"), 
         br(),actionButton("Login", "Log in"))) 
      ,tags$style(type="text/css", "#login {font-size:10px; text-align: left;position:absolute;top: 40%;left: 50%;margin-top: -10px;margin-left: -150px;}") 
     )} 

     ui2 <- function(){list(tabPanel("Test",get_ui(USER$role)[2:3]),get_ui(USER$role)[[1]])} 

     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 
        USER$role=get_role(Username) 

       } 
      } 
      } 
     } 
     } 
     }) 
     observe({ 
     if (USER$Logged == FALSE) { 

      output$page <- renderUI({ 
box(
      div(class="outer",do.call(bootstrapPage,c("",ui1())))) 
      }) 
     } 
     if (USER$Logged == TRUE) { 
      output$page <- renderUI({ 
box(width = 12, 
      div(class="outer",do.call(navbarPage,c(inverse=TRUE,title = "Contratulations you got in!",ui2()))) 
     )}) 
      #print(ui) 
     } 
     }) 
    }) 

3) user.r:

list_field_user = list(tabPanel("test2",fluidRow(column(6,numericInput("inputtest", "test", value = 0),column(6,actionButton(inputId ="test1",label ="go"))))), 
         h1("1234"),h2("234")) 

4) admin .r

list_field_admin = list(h1("admin"),h2("admin")) 

!!! разместить все эти файлы в одном реже

этого простого примера, но это может помочь вам

+0

У вас проблема в' css', и я думаю, вам не нужно 'ui = (htmlOutput («page»)) 'in ui, я использую' uiOutpu t ("page") ', и вам не нужно' << - 'для реактивного значения, другое я получаю от вашего кода. – Batanichek

+0

Спасибо вам огромное. да ты прав . Он работает очень хорошо. – user

+0

можно добавить некоторые виджеты и элементы управления в user.r и admin.r? – user

Смежные вопросы