如何处理R连接字符串中的DB密码?

时间:2012-10-23 15:09:00

标签: sql r passwords rstudio-server

虽然我不知道SO法定人数会是什么,但问题本身很简单: 当你从R?

连接到数据库时,你们如何处理数据库连接字符串中的密码?

教程经常会显示这样的例子。

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

如果数据库确实是您的实验性本地主机,这可能有些现实。但是,如果将其与服务器上的多个用户一起使用,则可能不希望像这样公开db凭据。特别是在将RStudio Server与SQL数据库结合使用时,您可能希望执行加密操作。你有什么经历?

4 个答案:

答案 0 :(得分:9)

这是一段示例代码,它使用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)

在这种情况下,它只是在最后打印出未隐藏的密码,但您可以将其包装在函数中以返回该值,然后将其用作密码参数的值。或者你可以在调用local时调用此调用和连接调用(使用tclvalue行作为密码),以便包含密码的变量在使用后立即消失。

修改

对于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)

答案 1 :(得分:7)

所以我喜欢使用配置文件的解决方案 - 这是一个很好的答案。密码提示答案也有一些很好的评论,这使我得到了这个解决方案:

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

答案 2 :(得分:6)

我对同一个问题有不同的解决方案,每次连接时都不需要用户输入密码。我正在使用.my.cnf文件功能。 基本上每个用户在其RStudio Server主目录的根目录中都有一个.my.cnf文件,其中包含所有MySQL数据库的密码,因此在R脚本中我只是通过“组”功能引用数据库。 / p>

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 :(得分:0)

使用Keyring软件包,您可以通过以下方式实现功能。

require(keyring)
require(RMySQL)
keyring::keyring_create("set_keyring_password_here") #Remember this password
keyring::key_set("dbname", keyring = "Your_set_keyring_password_here") 
keyring::key_set("host", keyring = "Your_set_keyring_password_here")
keyring::key_set("port", keyring = "Your_set_keyring_password_here")
keyring::key_set("user", keyring = "Your_set_keyring_password_here")
keyring::key_set("pass", keyring = "Your_set_keyring_password_here")
keyring::key_set("unix.sock", keyring = "Your_set_keyring_password_here")

m<-MySQL() #set the driver to mysql check your database driver and edit
summary(m)
    con<-dbConnect(m, dbname = keyring::key_get("dbname",
                      keyring = "Your_set_keyring_password_here"),
                   host=keyring::key_get("host",
                      keyring = "Your_set_keyring_password_here"),
                   port=as.numeric(keyring::key_get("port",
                      keyring = "Your_set_keyring_password_here")),
                   user=keyring::key_get("user",
                      keyring = "Your_set_keyring_password_here"),
                   pass=keyring::key_get("pass",
                      keyring = "Your_set_keyring_password_here"),
                   unix.sock=keyring::key_get("unix.sock",
                      keyring = "Your_set_keyring_password_here"),
                     )
keyring::keyring_lock("Your_set_keyring_password_here") #Lock keyring after using it.