Create a SQLite database with credentials data protected by a password.
create_db(
credentials_data,
sqlite_path,
passphrase = NULL,
flags = RSQLite::SQLITE_RWC
)
A data.frame
with information about users, user
and password
are required.
Path to the SQLite database.
A password to protect the data inside the database.
RSQLite::SQLITE_RWC:
open the database in read/write mode and create the database file if it does not already exist;
RSQLite::SQLITE_RW:
open the database in read/write mode. Raise an error if the file does not already exist;
RSQLite::SQLITE_RO:
open the database in read only mode. Raise an error if the file does not already exist
The credentials data.frame
can have the following columns:
user (mandatory) : the user's name.
password (mandatory) : the user's password.
admin (optional) : logical, is user have admin right ? If so, user can access the admin mode (only available using a SQLite database). Initialize to FALSE if missing.
start (optional) : the date from which the user will have access to the application. Initialize to NA if missing.
expire (optional) : the date from which the user will no longer have access to the application. Initialize to NA if missing.
applications (optional) : the name of the applications to which the user is authorized,
separated by a semicolon. The name of the application corresponds to the name of the directory,
or can be declared using : options("shinymanager.application" = "my-app")
additional columns : add others columns to retrieve the values server-side after authentication
create_db
, create_sql_db
, check_credentials
, read_db_decrypt
if (FALSE) {
library(shiny)
library(shinymanager)
#### init the Sqlite Database
# Credentials data
credentials <- data.frame(
user = c("shiny", "shinymanager"),
password = c("azerty", "12345"), # password will automatically be hashed
stringsAsFactors = FALSE
)
# you can use keyring package to set database key
library(keyring)
key_set("R-shinymanager-key", "obiwankenobi")
# Create the database
create_db(
credentials_data = credentials,
sqlite_path = "/path/to/database.sqlite", # will be created
passphrase = key_get("R-shinymanager-key", "obiwankenobi")
# passphrase = "secret" # or just a word, without keyring
)
### Use in shiny
ui <- fluidPage(
tags$h2("My secure application"),
verbatimTextOutput("auth_output")
)
# Wrap your UI with secure_app
ui <- secure_app(ui, choose_language = TRUE)
server <- function(input, output, session) {
# call the server part
# check_credentials returns a function to authenticate users
res_auth <- secure_server(
check_credentials = check_credentials(
db = "/path/to/database.sqlite",
passphrase = key_get("R-shinymanager-key", "obiwankenobi")
)
)
output$auth_output <- renderPrint({
reactiveValuesToList(res_auth)
})
observe({
print(input$shinymanager_where)
print(input$shinymanager_language)
})
# your classic server logic
}
shinyApp(ui, server)
}