门卫对访问权限的外键违反

时间:2019-05-02 18:57:01

标签: ruby-on-rails postgresql foreign-keys doorkeeper

我正在尝试设置Doorkeeper,使我的表Company拥有Access和Grant令牌。我正在关注this guide,但我使用的是公司而非用户作为资源所有者。

这是我接受预授权提示并发送到/oauth/authorize后出现的错误:

ERROR:  insert or update on table "oauth_access_grants" violates foreign key constraint "fk_rails_330c32d8d9"
DETAIL:  Key (resource_owner_id)=(2) is not present in table "companies".

我的模式:

add_foreign_key "oauth_access_grants", "companies", column: "resource_owner_id"
add_foreign_key "oauth_access_tokens", "companies", column: "resource_owner_id"

以及我公司模型中的关联:

has_many :access_grants, class_name: 'Doorkeeper::AccessGrant', foreign_key: :resource_owner_id, dependent: :destroy
has_many :access_tokens, class_name: 'Doorkeeper::AccessToken', foreign_key: :resource_owner_id, dependent: :destroy

我还确保核对数据库(db:reset)并重新运行迁移(db:migrate:reset)。在这一点上我很困惑。关于我可能会想念的东西有什么想法吗?

如果有帮助,我正在使用Rails 5.2.3,Doorkeeper 5.1.0和PostgreSQL 9.6.5。

1 个答案:

答案 0 :(得分:0)

啊哈,看来我只需要橡皮鸭。违反了外键约束,因为当我在寻找公司ID时,我试图向其分配用户的ID(恰好碰巧该ID的公司不存在)。答案是更新我的Doorkeeper配置中的resource_owner_authenticator块。

通常看起来像这样:

resource_owner_authenticator do
  User.find_by_id(session[:user_id]) || redirect_to(new_session_url)
end

但是因为我没有将用户分配为资源所有者,所以我需要对其进行修改。就我而言,我知道一个用户属于一个公司,所以更新后的代码块如下:

resource_owner_authenticator do
  unless user = User.find_by_id(session[:user_id])
    redirect_to(new_session_url)
  end

  user.company
end

希望这对将来的人们有帮助!