15

虽然我不知道 SO quorum 是什么,但问题本身很简单:当您从 R 连接到数据库时,你们如何处理 db 连接字符串中的密码?

教程经常展示这样的例子。

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

如果数据库确实是您的实验性本地主机,这可能有点现实。但是,如果您将它与服务器上的多个用户一起使用,您可能不想像这样公开数据库凭据。特别是在将 RStudio Server 与 SQL 数据库结合使用时,您可能想要做一些加密的事情。你的经验是什么?

4

4 回答 4

12

下面是一段示例代码,它使用 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以便包含密码的变量在使用后立即消失。

编辑

对于 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)
于 2012-10-23T15:49:57.113 回答
9

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

conn <- dbConnect(drv, "jdbc:sqlserver://host:port", 'username', password=.rs.askForPassword("Enter password:"))
于 2016-03-31T21:17:54.917 回答
7

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

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
于 2013-02-26T22:00:11.420 回答
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.
于 2019-08-12T07:01:20.690 回答