我正在使用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
然而,我不确定如何做我想要的事情,因此会重视一些忠告。
答案 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
模型(provider
和uid
)。有了这个,我担心用户无法同时使用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
您可以将其转移到多个开发环境,但显然不是生产环境。