如何使用Google用户预先填充我的Rails 4应用程序?

时间:2016-04-28 20:00:10

标签: ruby-on-rails-4 omniauth seed

我正在使用Rails 4.2.5和“omniauth-google-oauth2”gem。在我的应用程序中,用户可以登录的唯一方法是通过他们的Google或Facebook登录。我想要的是使用管理员角色向初始用户my(email ='davea@gmail.com“)预先填充我的应用程序。以编程方式执行此操作会很好,这样当我将其推送到其他环境时,我可以使用相同的代码。

我的角色表(通过db / seeds.rb)具有角色

"123,456"

我的app / model / user.rb文件有

Admin
User

然而,我不确定如何做我想要的事情,因此会重视一些忠告。

2 个答案:

答案 0 :(得分:2)

现在假设您拥有自己的Google uid。只需从种子中创建一个用户,例如:

user = User.new(
  provider: "google",
  uid: "your-google-id",
  email: "davea@gmail.com",
  name: "Your name"
)
user.roles << admin_role # Replace this line with your role assignment
user.save # Perhaps use save(validate: false) if there're validations for other fields

这样,当您使用Google登录时,omniauth逻辑应该能够找到种子用户,这意味着您将能够充当管理员。

请注意这假设您不需要Google oauth令牌来执行任何进一步的操作,因为您没有保存,并且from_omniauth如果用户记录已经存在则它不会保存

P.S。从您的示例代码中,Oauth信息直接保存到User模型(provideruid)。有了这个,我担心用户无法同时使用Facebook和Google登录,因为他们都希望保存到这两个字段。

更新:从我的代码库粘贴模型,该模型是User的单独模型,允许多个提供商登录。当然,控制器需要更新才能使用Authorization而不是User。以防它有帮助。

class Authorization < ActiveRecord::Base
  belongs_to :user

  def self.from_omniauth(auth)
    authorization = where(auth.slice(:provider, :uid)).first_or_create
    return authorization if authorization.user

    if user = User.where(email: auth.info.email).first
      authorization.bind_user(user)
    else
      user = authorization.create_user(auth.info)
    end

    authorization
  end

  def bind_user(user)
    self.user = user
    save
  end

  def create_user(info)
    user = User.new(
      email:      info.email,
      password:   Devise.friendly_token[0, 20],
      first_name: info.first_name,
      last_name:  info.last_name,
    )
    user.save(validate: false)

    bind_user(user)

    user
  end
end

答案 1 :(得分:1)

您必须通过您的seed.rb文件通过控制器运行请求才能执行OAuth2进程。

由于您很可能必须输入凭据或从GUI中选择您的Google帐户,我建议您在seed.rb文件中运行一个系统命令,该命令会打开浏览器到您的授权操作的网址。

# Mac:
system("open <url_to_authorize_action>")

如果需要序列化,请在之后立即添加一个while循环,每隔N次阈值检查一次DB,以查看该用户是否已获得授权。

while <user_not_authorized> do
    sleep <N seconds>
end

您可以将其转移到多个开发环境,但显然不是生产环境。