R Shiny нарушает аутентификацию PostgreSQL с помощью .pgpass

У меня есть пароль к базе данных, хранящийся в файле pgpass.conf. Я подключаюсь к базе данных из R с помощью RPostgres, не указывая пароль, поэтому он читается из pgpass.conf, например:

con <- dbConnect(RPostgres::Postgres(), 
                 dbname = "dbname",
                 user = "username",
                 host = "localhost",
                 port = "5432")

Обычно это работает отлично, однако, когда я пытаюсь подключиться к базе данных из блестящего приложения, это не работает. Определение подключения точно такое же, как указано выше, и помещено в скрипт server.R. Когда я запускаю приложение Shiny с аргументами по умолчанию, я получаю сообщение об ошибке:

FATAL:  password authentication failed for user "username"
password retrieved from file "C:\Users\...\AppData\Roaming/postgresql/pgpass.conf"

Когда пароль явно указан в определении соединения:

con <- dbConnect(RPostgres::Postgres(), 
                 dbname = "dbname",
                 user = "username",
                 host = "localhost",
                 password = "mypass",
                 port = "5432")

все работает.

Что еще более странно, когда для порта для блестящего установлено какое-то значение, например: shiny::runApp(port = 4000), соединение устанавливается без указания пароля, но ТОЛЬКО в первый раз - это означает, что когда приложение закрывается и снова открывается в том же сеансе R, ошибка происходит снова.

Я протестировал пакет «RPostgreSQL» — он тоже не работает, отличается только сообщение об ошибке:

Error in postgresqlNewConnection(drv, ...) : 
  RS-DBI driver: (could not connect postgres@localhost on dbname "dbname")

Я использую 32-битный R, но я тестировал его на 64-битном, и это было то же самое. Приложение Shiny запускалось как в браузере (Chrome), так и в Rstudio Viewer.

Вот моя информация о сеансе:

R version 3.2.2 (2015-08-14)
Platform: i386-w64-mingw32/i386 (32-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250        LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RPostgres_0.1  DBI_0.3.1.9008 shiny_0.12.2  

loaded via a namespace (and not attached):
[1] R6_2.1.1         htmltools_0.2.6  tools_3.2.2      rstudioapi_0.3.1     Rcpp_0.12.1.3    jsonlite_0.9.17  digest_0.6.8    
[8] xtable_1.7-4     httpuv_1.3.3     mime_0.4         RPostgreSQL_0.4

person BartekCh    schedule 27.10.2015    source источник


Ответы (2)


Скорее всего, есть что-то другое в среде, в которой команда запускается между Shiny и вашей системой R GUI. Я обхожу это, сохраняя свои учетные данные в Renviron. файл:

readRenviron("~/.Renviron")
con <- dbConnect(RPostgres::Postgres(), 
                 dbname = Sys.getenv('pg_db'),
                 user = Sys.getenv('api_user'),
                 ...)

Дело в том, что вы можете поддерживать отдельные Renviron для промежуточной и производственной сред. Это позволяет вашему сценарию использовать commandArgs(), чтобы указать, какие учетные данные БД он должен использовать:

#!/usr/bin/env Rscript
environ_path <- switch(commandArgs(),
                  'staging' = {"~/staging.Renviron"},
                  'production' = {"~/production/Renviron"})

readRenviron(environ_path)

Затем из БАША:

Rscript analysis.R staging
person Jason French    schedule 01.12.2015
comment
Это действительно возможное и довольно простое решение моей проблемы. В любом случае, мне все еще любопытно, как могло случиться, что стандартный файл pgpass не работает должным образом в Shiny. Я пытался найти кое-что в исходных файлах как для Shiny (на самом деле httpuv), так и для psql, но я не очень хорошо владею C, поэтому ничего не нашел. - person BartekCh; 08.12.2015

Ошибка в Postgresql:

C:\Users\...\AppData\Roaming/postgresql/pgpass.conf

путь к файлу содержит / вместо \

person Michael Himbert    schedule 22.10.2020
comment
Современные Windows обычно могут использовать как \, так и / взаимозаменяемо для путей к файлам (см. >этот вопрос) - person Brits; 23.10.2020