Нарушение внешнего ключа привратника при предоставлении доступа - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь настроить Doorkeeper, чтобы у моего стола Company были токены доступа и предоставления.Я следовал этому руководству , за исключением того, что я использовал компании, а не пользователей в качестве владельцев ресурсов.

Это ошибка, которую я получаю после того, как я принял приглашение предварительной авторизации иотправить на /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 Ответ

1 голос
/ 02 мая 2019

Ага, похоже, мне просто нужно это утка резиновая. Ограничение внешнего ключа было нарушено, потому что я пытался присвоить ему свой идентификатор пользователя, когда он искал идентификатор компании (и так сложилось, что компании с таким идентификатором не существует). Ответ состоял в том, чтобы обновить блок resource_owner_authenticator в моей конфигурации Doorkeeper.

Обычно это выглядит примерно так:

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

Надеюсь, это поможет любым будущим людям!

...