【问题标题】:How to handle DB passwords in R connection strings?如何处理 R 连接字符串中的数据库密码?
【发布时间】:2012-10-13 13:40:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • @Duncan 在这里有一个很好的答案stackoverflow.com/questions/6101605/…
  • 您可以使用keyringr 包连接到操作系统密钥环/钥匙串。
  • @JoshGilfillan 谢谢,我会尽快检查并提供反馈。包裹是新的吗?
  • @MattBannert 是的,2016 年 10 月首次发布。

标签: sql r passwords rstudio-server


【解决方案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 的调用中,这样包含密码的变量在使用后就会消失。

编辑

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

【讨论】:

  • 很酷的想法,尽管tcltkRStudio server 一起使用,但内心有些怀疑。你能想象一个带有 readline 的解决方案,它也隐藏了密码吗?
  • 糟糕,我错过了问题的“服务器”部分。这将在本地机器上工作,但我怀疑网络。有一些方法可以通过 .cgi 脚本获取加密/隐藏密码,因此服务器可能会发送 .cgi 以弹出浏览器窗口来获取密码,但这超出了我的评论经验。我怀疑 readline 会起作用,因为它使用接口来获取信息,这需要在接口级别而不是 readline 级别进行编程。
  • 无论如何,这是一个有用的答案,+1。无论实施方式如何,让人们输入密码都是一个很好的建议。
  • 服务器部分有一个很好的解决方案,如果您使用 rstudio 服务器,您可以使用.rs.askForPassword。交互式输入密码绝对是个好建议。
  • tcltk 包似乎无法下载。库名是什么?
【解决方案2】:

所以我喜欢使用配置文件的解决方案 - 这是一个很好的答案。在密码提示答案上也有一些很好的 cmets 让我想到了这个解决方案:

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

【讨论】:

    【解决方案3】:

    对于同一问题,我有不同的解决方案,它不需要用户在每次连接时都输入密码。我正在使用 .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
    

    【讨论】:

    • 2017:dbDriver 函数已弃用。仍在寻找解决方案。
    【解决方案4】:

    使用 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.
    

    【讨论】:

      猜你喜欢
      • 2023-02-08
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      相关资源
      最近更新 更多