PaulC91 / shinyauthr

R package with shiny authentication modules
https://paulc91.github.io/shinyauthr/
Other
427 stars 81 forks source link

Allow reactive user data #62

Closed burgerga closed 8 months ago

burgerga commented 1 year ago

This will allow updating the allowed users without restarting the app. Backwards compatible with providing user_base as a tibble (meaning shinyauthr::runExample() still works). Example usage using reactiveFileReader where usernames and passwords are stored using csv:

user_base.csv:

user,password,permissions,name
user1,pass1,admin,User One
user2,pass2,standard,User Two

app.R:

library(shiny)

user_base <- reactiveFileReader(1000, NULL, 'user_base.csv', read.csv)

ui <- fluidPage(
  # add logout button UI
  div(class = "pull-right", shinyauthr::logoutUI(id = "logout")),
  # add login panel UI function
  shinyauthr::loginUI(id = "login"),
  # setup table output to show user info after login
  tableOutput("user_table"),
  tableOutput("user_table2")
)

server <- function(input, output, session) {

  # call login module supplying data frame, 
  # user and password cols and reactive trigger
  credentials <- shinyauthr::loginServer(
    id = "login",
    data = user_base,
    user_col = user,
    pwd_col = password,
    log_out = reactive(logout_init())
  )

  # call the logout module with reactive trigger to hide/show
  logout_init <- shinyauthr::logoutServer(
    id = "logout",
    active = reactive(credentials()$user_auth)
  )

  output$user_table <- renderTable({
    # use req to only render results when credentials()$user_auth is TRUE
    req(credentials()$user_auth)
    credentials()$info
  })
  # DEBUG
  output$user_table2 <- renderTable({
    user_base()
  })
}

shinyApp(ui = ui, server = server)
PaulC91 commented 8 months ago

Thanks for this PR, it's a very useful feature. And sorry it took so long to merge!

burgerga commented 8 months ago

No problem :)