Подтвердить что ты не робот

Как обрабатывать пароли DB в строках соединения R?

Хотя я не знаю, какой будет кворум SO, сам вопрос прост: Как y'all обрабатывать пароли в строке подключения db при подключении к базе данных из R?

В учебниках часто показан пример.

con <- dbConnect(MySQL(), user="root", password="test", 
             dbname="research_db", host="localhost",
             client.flag=CLIENT_MULTI_STATEMENTS)

Если база данных действительно является вашим экспериментальным локальным хостом, это может быть несколько реалистичным. Однако, если вы используете его с несколькими пользователями на сервере, вы можете не захотеть выставить учетные данные db, как это. В частности, при объединении RStudio Server с базой данных SQL вы можете сделать что-то зашифрованное. Каков ваш опыт?

4b9b3361

Ответ 1

Вот фрагмент примерного кода, который использует пакет tcltk для запроса пароля при скрытии фактического значения:

library(tcltk)
tt <- tktoplevel()
pass <- tclVar()
tkpack(tklabel(tt,text='Password:'))
tkpack(tkentry(tt,textvariable=pass,show='*'))
tkpack(tkbutton(tt,text="Done",command=function()tkdestroy(tt)))
tkwait.window(tt)
tclvalue(pass)

В этом случае он просто распечатывает незакрытый пароль в конце, но вы можете обернуть это в функцию, чтобы вернуть это значение, а затем использовать это как значение аргумента пароля. Или вы можете поместить это и вызов соединения (с линией tclvalue как пароль) внутри вызова local, чтобы переменная, содержащая пароль, исчезла, как только она будет использована.

Edit

Для RStudio и RStudio-сервера существует функция .rs.askForPassword. Используйте его как:

psswd <- .rs.askForPassword("Database Password:")
con <- dbConnect(MySQL(), user="root", password=psswd, 
             dbname="research_db", host="localhost",
             client.flag=CLIENT_MULTI_STATEMENTS)

Ответ 2

У меня есть другое решение для той же проблемы, которая не требует от пользователя ввода пароля каждый раз, когда они соединяются. Я использую функциональность файла .my.cnf. В основном каждый пользователь имеет файл .my.cnf в корневом каталоге своего исходного каталога RStudio Server, который содержит их пароли для всех баз данных MySQL, поэтому в R script я просто ссылаюсь на базу данных через функциональность группы.

R скрипты:

library("RMySQL")
m <- dbDriver("MySQL")
# connect using .my.cnf
con <- dbConnect(m, group = "theDatabase")

.my.cnf файл:

[client]
user = userName
host = mysql.server.com
password = MyPassword
[theDatabase]
database = hr
[theDatabase2]
user = opto
database = opto
password = pure-light
host = merced

Ответ 3

Поэтому мне нравится решение использовать файл конфигурации - это отличный ответ. Также есть несколько замечаний по ответу на пароль, который привел меня к этому решению:

conn <- dbConnect(drv, "jdbc:sqlserver://host:port", 'username', password=.rs.askForPassword("Enter password:"))