【问题标题】:Creating a Mysql user within a Rails controller action在 Rails 控制器操作中创建 Mysql 用户
【发布时间】:2013-06-20 09:28:57
【问题描述】:

在一个应用程序上工作,管理员只会使用它来创建另一个应用程序的多个实例。

换句话说,app A 将用于在服务器上创建 app B 的克隆,并创建在子域 new_clone.domain.com 上运行该克隆应用所需的所有配置。

成功克隆了应用程序,创建了apache 配置文件,unicorn server settings 文件。设法运行 rake db:create; db:migrate 但我使用 mysql 的 root 用户执行此操作。

在克隆应用程序时,我为新克隆的应用程序生成了一个database.yml 文件,此时usernamepassword 设置为root,但我希望有一个不同的每个克隆应用的用户。

应用程序 A 有一个名为 Subdomain 的模型,在 subdomains_controller.rbcreate 操作中我做了所有的事情,克隆、生成配置文件、运行 rake 任务等......还有这个 @ 987654335@ 操作我需要创建一个具有特定数据库权限的新 Mysql 用户。

到目前为止我所做的尝试,不能说我做了很多,我尝试在控制器创建操作中运行 mysql 命令:

def create
  if @subdomain.save
    ....
    system "mysql -u root -p root; create database new_database;..."
    ....
  else
    ....
  end
end

但这会使我的创建操作暂停,直到我输入密码,即使我能找到一种方法来解决它,我也不确定其余的 mysql 命令是否可以工作。可能有一种更好的方法可以在不进入 mysql 控制台的情况下使用一个命令行添加 Mysql 用户。

谢谢。

【问题讨论】:

  • 您的用户是否拥有创建数据库或用户所需的权限?
  • 好吧,我的 root 用户是的,但这就是想法 - 当创建一个新用户时,它应该拥有创建数据库的权限,并且只拥有该数据库的所有权限。
  • 因为-proot 之间有空格,该命令要求您提供root 密码,请查看mysql 手册页。
  • 不要认为从 ruby​​ 脚本中与 mysql 用户一起玩是个好主意,这可能是未来的重大安全威胁。
  • @toro2k 谢谢,这确实是问题的一部分。

标签: mysql ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2


【解决方案1】:

据我了解,您的 create 方法以 root mysql 用户在 Rails 应用程序下运行。 然后就可以通过 AR 适配器简单地执行 mysql 命令了:

# Create DB
ActiveRecord::Base.connection.execute("CREATE DATABASE IF NOT EXISTS \
`#{ActiveRecord::Base.sanitize(db_name)}` CHARACTER SET = `utf8` \ 
COLLATE = `utf8_general_ci`")    
# Create User
ActiveRecord::Base.connection.execute("REPLACE INTO mysql.user \ 
(Host, User, Password) VALUES(\"localhost\", \ 
\"#{ActiveRecord::Base.sanitize(db_user)}\", \ 
PASSWORD(\"#{ActiveRecord::Base.sanitize(db_password)}\"))")
# Grant access
ActiveRecord::Base.connection.execute("GRANT ALL PRIVILEGES ON \ 
`#{ActiveRecord::Base.sanitize(db_name)}`.* TO \ 
`#{ActiveRecord::Base.sanitize(db_user)}`")
# Apply 
ActiveRecord::Base.connection.execute("FLUSH PRIVILEGES")

【讨论】:

  • 谢谢,您的回答帮了很大的忙,但是我设法让它更短一些。我也会将其发布为答案。
【解决方案2】:

感谢 Yuriy 的回答,我得到了更短的工作方式:

  def create_mysql_user
    @db_name = "#{@subdomain.name}_domain_production"
    @db_user = "#{@subdomain.name}_user"
    @db_password = "#{@subdomain.name}domain_password"

    ActiveRecord::Base.connection.execute("GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER,
        INDEX ON `#{@db_name}`.* TO #{ActiveRecord::Base.sanitize(@db_user)}@localhost
        IDENTIFIED BY #{ActiveRecord::Base.sanitize(@db_password)};")
    # Apply
    ActiveRecord::Base.connection.execute("FLUSH PRIVILEGES")
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多