Как я могу использовать методы Devise в моем обратном вызове ConnectionAdapter? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть приложение rails 5.1, которое использует Devise для обработки аутентификации с моей моделью User.Это приложение имеет базу данных Oracle, которая требует установки системной переменной контекста с вошедшим в систему пользователем до выполнения каких-либо запросов, поэтому я надеялся сделать это в обратном вызове :checkout для адаптера подключения.

class ApplicationController < ActionController::Base
  before_action :log_user

  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.set_callback :checkout, :after do

    # Would like to get the logged-in user's username here so I can apply 
    # it to the oracle sys_context.

    # The below throws "undefined method 'user_signed_in?'"
    username = current_user.username if user_signed_in?

  end

  def log_user
    # When in this method, user_signed_in? and current_user work fine.
    puts "User is #{current_user.username}" if user_signed_in?
  end
end

Метод user_signed_in? не найден при запуске в блоке обратного вызова :checkout, хотя он обычно доступен в контроллере.Почему?

Кроме того, current_user в блоке, похоже, оценивает метод current_user, определенный в ConnectionAdapter, а не метод, определенный Devise.Как я могу получить доступ к Devise current_user?

Как я могу использовать эти предоставляемые Devise методы из этого обратного вызова?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы не можете использовать обратный вызов checkout, в тот момент, когда он выполняется, он не имеет связи с контекстом контроллера.Тот факт, что вы определили это здесь в вашем ApplicationController, не имеет отношения к контексту, в котором он фактически выполняется.

Вам нужно будет установить опцию соединения в before_action, чтобы вы работали вконтекст контроллера.Что-то вроде:

before_action :set_user_context

def set_user_context
  if current_user
    ApplicationRecord.connection.execute "DBMS_SESSION.SET_CONTEXT('whatever', 'goes', 'here', '#{current_user.username}')"
  end
end

... или что-то в этом роде.Обратите внимание, что вы можете захотеть добавить обратный вызов checkin, чтобы очистить значение после завершения соединения.

Кстати, я ответил на почти идентичный вопрос несколько дней назад: https://stackoverflow.com/a/54837596/152786 Различные командыхотя, но может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...