Локальная и удаленная аутентификация приложения Rails с помощью Devise (2 стратегии)

Я пытаюсь настроить 2 стратегии аутентификации, используя стандартную Devise ( :database_authenticable ), и если эта не удается, выполняется другая попытка на другом удаленном сервере :remote (как описано http://4trabes.com/2012/31/10/удаленная-аутентификация-с-устройством/ )

если я добавлю в свой инициализатор devise.rb блок config.warden

config.warden do |manager|
  manager.strategies.add(:remote, Devise::Strategies::RemoteAuthenticatable)
  manager.default_strategies(:scope => :user).unshift :remote
end

затем :remote становится стратегией по умолчанию, но это не то, что я ищу. Я хотел бы сначала иметь Devise::Strategies::DatabaseAuthenticable, а затем, если он не работает, Devise::Strategies::RemoteAuthenticable

Я знаю, что это возможно, поскольку надзиратель принимает каскадные стратегии.... как описано на https://github.com/hassox/warden/wiki/Strategies Использование стратегий..

но не вижу как это реализовать...


person Community    schedule 20.08.2013    source источник


Ответы (3)


Хотя здесь у меня нет конкретных технических советов, я могу сообщить, что в январе 2015 года я потратил около 2 дней, пытаясь получить совет 4trabes (упомянутый выше и в другом месте о переполнении стека), работая до абсолютного полного и сокрушительного отказа. Мне непонятно, действительно ли удаленная аутентификация в Devise работает полноценно. я мог

person fuzzygroup    schedule 15.01.2015
comment
Я пытаюсь получить удаленную аутентификацию в настройке Devise в новом проекте, я слежу за тем же сообщением в блоге. Был ли у вас прогресс? - person Tyler; 01.04.2015

Чтобы использовать стратегию, обратитесь к ней через метку, которая была присвоена ей при объявлении. например.

env['warden'].authenticate(:password)

Чтобы использовать стратегию :password. Вы можете использовать несколько стратегий, и каждая из них будет опробована по порядку, пока одна из них не будет остановлена ​​или не будет остановлена ​​ни одна из них.

env['warden'].authenticate(:password, :basic)

Это будет использовать :password и, если это не удастся, :basic стратегии.

person TheIrishGuy    schedule 20.08.2013
comment
спасибо, я прочитал это в вики надзирателя.. но как настроить это с помощью Devise (в инициализаторе разработки...) Я думаю, мне нужно сначала удалить значение по умолчанию (manager.default_strategies(:scope =› :user).unshift :remote ), поэтому значение по умолчанию вернется к :database_authenticable ( devise ) и где-нибудь добавится: env['warden'].authenticate(:database_authenticable, :remote) который, кажется, вызывается в сеансах#create в devise ..? - person ; 21.08.2013

блок надзирателя в инициализаторе разработки определяет набор стратегий в конфигурации надзирателя,

require 'devise/strategies/remote_authenticable'

config.warden do |manager|
 manager.strategies.add(:remote, Devise::Strategies::RemoteAuthenticatable)
 manager.default_strategies(:scope => :user).unshift :remote
end

однако стратегия :remote указана первой...

    # warden.config[:default_strategies][:user] =>  [:remote, :rememberable, :database_authenticatable]

поэтому я изменил #createaction в моих пользователях/sessions_controller, чтобы переместить :remote в конец списка

# POST /resource/sign_in
def create
    warden.config[:default_strategies][:user].push(warden.config[:default_strategies][:user].shift)
    self.resource = warden.authenticate!(auth_options)

теперь аутентификация пользователя начинается с Devise ( :rememberable, :database_authenticable), и если это не удается, то аутентификация на удаленном сервере выполняется с помощью :remote_authenticable

person Community    schedule 23.08.2013
comment
Привет @erwin, я не могу заставить это работать. Дело в том, что действие create вызывается после выполнения любой стратегии, будь то стратегия по умолчанию (database_authenticable) или новая удаленная стратегия. Я добавил операторы puts, чтобы проверить, какой из них вызывается первым. Как вы думаете, что мне не хватает? - person Ramandeep Singh; 13.11.2013
comment
Это немного поздно, но я думаю, вы могли бы добавить Warden::Strategies.add :remote, RemoteAuthenticatable и Devise.add_module :remote, :strategy => true или что-то в этом роде (не проверено) в конец вашего файла стратегии. (См. github.com/mattconnolly/devise- например, custom-strategy-demo/blob/master/.) - person conciliator; 30.01.2014