Resque, Devise и аутентификация администратора

Используя Resque и Devise, у меня есть роли для пользователя, например:

User.first.role #=> admin
User.last.role #=> regular

Я хочу настроить аутентификацию для Resque. Итак, внутри config/routes.rb у меня есть:

namespace :admin do
  mount Resque::Server.new, :at => "/resque", :as => :resque
end

И, конечно же, он доступен для всех зарегистрированных пользователей.

Есть ли способ использовать роль из User.role? Он должен быть доступен только пользователям с ролью «admin».

Большое спасибо.


person There Are Four Lights    schedule 02.09.2011    source источник


Ответы (4)


Используйте ограничение маршрута в файле routes.rb:

  resque_constraint = lambda do |request|
    request.env['warden'].authenticate? and request.env['warden'].user.admin?
  end

  constraints resque_constraint do
    mount Resque::Server, :at => "/admin/resque"
  end
person jpemberthy    schedule 13.09.2011
comment
Это работает, однако неавторизованные пользователи получат страницу 404 и не будут перенаправлены на страницу входа. Имейте это в виду при использовании этой техники. - person ARun32; 04.01.2013

в вашем routes.rb файле:

authenticate :user, lambda {|u| u.role == 'admin' } do
    mount Resque::Server.new, :at => "/resque"
end

Кроме того, убедитесь, что где-то в этом файле есть devise_for :users

person Yossi Shasho    schedule 08.11.2012
comment
Ваше решение полностью работает, и оно хорошо, потому что, как сказал заказчик, мы используем одну и ту же модель как для администраторов, так и для пользователей. Спасибо! - person gleenn; 07.05.2013
comment
Это была именно моя проблема :) - person Yossi Shasho; 02.12.2013
comment
Мне это решение нравится больше, чем принятый ответ, потому что оно намного элегантнее и читабельнее. - person Daniel Bonnell; 16.10.2015

Вы можете попробовать создать подкласс класса Resque::Server следующим образом:

require 'resque/server'

class SecureResqueServer < Resque::Server

  before do
    redirect '/login' unless some_condition_is_met! 
  end

end

И используя его на своих маршрутах следующим образом:

mount SecureResqueServer.new, :at => '/resque'

Я получил эту информацию из этого блога. Попробуйте.

person cicloon    schedule 02.09.2011
comment
Выглядит хорошо, но как я могу проверить роль curent_user отсюда? Любые идеи? - person There Are Four Lights; 02.09.2011
comment
Это решение намного лучше, чем использование ограничения маршрута. Это связано с тем, что аутентификация должна выполняться внутри контроллера, а не внутри маршрутов. - person nickh; 22.10.2011
comment
Кроме того, ограничение маршрута создает маршрут только в том случае, если ограничение соблюдается, в противном случае выдается ошибка 404. Это, вероятно, будет вести себя иначе, чем остальная часть панели администратора. - person ben; 19.07.2012
comment
это то, что я использую, помните, что вам нужно включить любые помощники, которые вы используете для аутентификации, а также снова инициировать сеансы - person Dmitry; 06.09.2013
comment
Есть ли у кого-нибудь сопоставимое решение для новой жемчужины Resque-Web? Кажется, что он использует не Resque::Server, а Rails Engine для монтирования приложения. - person Nemo; 14.07.2014
comment
хотя из этого ответа неясно, куда поместить класс (обратите внимание, что ссылка на сообщение в блоге не работает), в моем случае я поместил класс в файл инициализатора (в config/initializers/), и он работал нормально - person medBouzid; 27.10.2020

Всегда есть новое решение, введите его в файл route.rb для rails > 3.1:

  authenticate :admin do
    mount Resque::Server.new, :at => "/resque"
  end

И не забывайте:

devise_for :admins
person Calin    schedule 03.04.2012
comment
Это кажется лучшей идеей, но devise, похоже, перенаправляется на /resque/admin/login, если не аутентифицирован. Вы знаете какой-нибудь способ указать перенаправление без авторизации? - person jtesch; 05.04.2012
comment
Проверьте решение cicloon, приведенное ниже, решает эту проблему, и это лучше - person Calin; 05.04.2012
comment
Что касается вашей проблемы с маршрутом, вы можете попробовать добавить match /resque/admins/sign_in =› redirect(/admins/sign_in) в свой route.rb, см. stackoverflow.com/questions/9731550/ - person Calin; 08.04.2012
comment
Это сработало лучше всего для меня по сравнению с другими решениями. Он также направляет вас на правильный URL-адрес после входа в систему. /jobs -> перенаправляет на /admin/login -> обратно на /jobs (после успешного входа) - person ARun32; 04.01.2013
comment
Это сработало для меня, но я не могу понять, какой драгоценный камень предоставляет этот метод аутентификации, и это меня беспокоит... - person odigity; 09.04.2014
comment
А, нашел: rdoc.info/github/plataformatec/devise /master/ActionDispatch/ - person odigity; 09.04.2014