cancan skip_authorization_check для аутентификации Devise - PullRequest
19 голосов
/ 11 августа 2011

Поскольку любой может зарегистрироваться и затем войти в систему, ... и поскольку пользователь не определен для ролей до тех пор, пока он не войдет в систему, не имеет ли смысла пропускать authorization_check для Devise?

Исходя из этого, я наследую от контроллера регистрации Devise этот регистрационный_сегмент_контроллера и помещаю его в каталог контроллера.

class Users::RegistrationsController < Devise::RegistrationsController
  skip_authorization_check
end

изменить файл маршрутов:

devise_for :users, :controllers => { :registrations => "registrations" }

Я что-то упускаю, хотя:

This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check.

Спасибо за вашу помощь.

1 Ответ

38 голосов
/ 14 февраля 2012

Простое решение

check_authorization :unless => :devise_controller?

Если в какой-то момент вам придется вручную устанавливать check_authorization в каждом контроллере, вы забудете и откроете дыру в безопасности вашего приложения.Лучше явно указывать контроллеры белого списка, которым не требуется авторизация с помощью cancan.

Это ясно показано в документации CANCAN по адресу

https://github.com/ryanb/cancan/wiki/Ensure-Authorization

РЕДАКТИРОВАТЬ

class ApplicationController < ActionController::Base
  check_authorization :unless => :do_not_check_authorization?
  private
  def do_not_check_authorization?
    respond_to?(:devise_controller?) or
    condition_one? or
    condition_two?
  end

  def condition_one?
   ...
  end

  def condition_two?
   ...
  end
end
...