2

今天我尝试在我的本地 Ubuntu 10.04 VM 上安装带有 Postgresql 8.4 的 Rails 3.2.1。我基本上遵循了http://www.mcbsys.com/techblog/2011/10/set-up-postgresql-for-rails-3-1/的说明。我唯一需要做的就是将 pg_hba.conf 中的一行更改为“local postgres myapp trust”,因为默认用户 postgres 没有密码,我必须创建一个名为“login_name”的 postgresql 用户来匹配我的 Linux系统登录用户名(为了这个例子,我们称之为“login_name”),否则我无法使用 rake db:create 创建数据库。

我的 database.yml 文件如下所示:

development:
  adapter: postgresql
  encoding: unicode
  database: development_db
  pool: 5
  user: login_name
  password: some_random_password

我的问题是为什么我必须创建一个与我的系统登录名匹配的用户名才能让它工作,有没有办法解决这个问题? 我用谷歌搜索了这个,真的找不到满意的答案。

4

2 回答 2

2

看看你的 PostgreSQL 配置,你会在那里找到两个相关的文件:

  1. pg_hba.conf
  2. pg_ident.conf

pg_hba 控制如何处理身份验证请求的机制,通常使用如下条目:

local   all         all                          ident

ident意味着,所有本地/unix-socket 连接都使用系统用户的身份完成。

如果你有一个“非系统”用户,你需要在 pg_ident.conf 中为他们创建一个映射:

# MAP    OS-Name    DB-Name
myusers  user       user
myusers  user       dbuser

像这样改变 pg_hba.conf:

local    all      all      ident map=myusers

身份验证在配置文件和PostgreSQL 管理指南中都有很好的记录

于 2012-04-20T16:04:14.363 回答
0

您指定user:的名称是用于登录的名称;如果您不希望,您不必将其设为系统用户。问题是,当数据库初始化时,它的所有者(通常)设置为执行 . 的用户名db_init,这可能会有所不同。所以主机的用户名和数据库中的用户名往往是松耦合的。

从安全的角度来看,最佳实践是以用户身份运行init_dbpostgres然后显式GRANT授予权限,或者将template1数据库的所有者(和密码)更改为您希望应用程序使用的所有者。数据库(更准确地说是模式)将使用template1它们创建时的设置。

实际上,在可 Web 访问的服务器上,我喜欢使用与数据库用户同名sudo的(系统)用户名,访问受限(很少或没有) 。设置一个名称并在任何地方使用它。这使得复制数据库、配置等变得更加容易。否则,您最终会收到“找不到角色 foo”错误。

Rails 让开发变得超级容易,这很好。它不应该让创建一个不安全的生产环境变得超级容易:-)

于 2012-03-18T16:42:19.047 回答