2011-08-11 12 views
18

Ponieważ każdy może się zarejestrować, a następnie zalogować, ... a ponieważ użytkownik nie jest identyfikowany dla ról, dopóki nie zaloguje się, czy nie ma sensu pominąć pole autoryzacji dla Devise?cancan skip_authorization_check for Devise authentication

Przechodząc do tego założenia, dziedziczę z kontrolera rejestracji Devise przy pomocy tego rejestratora registrations_controller i umieściłem go w katalogu kontrolera.

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

zmiana w pliku trasach:

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

ja czegoś brakuje jednak:

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

Dzięki za pomoc.

+0

@RyanBigg, kiedy ominąć ten problem, mam zamiar sprawdzić, czy odpowiedź na poprzednie pytanie jest poprawne dla aplikacji. Dzięki. – Jay

+0

@Hosemeyer, Muszę ominąć ten problem, zanim będę mógł zastosować się do twoich rad w drugim pytaniu. Dzięki za pomoc. – Jay

Odpowiedz

38

Proste rozwiązanie

check_authorization :unless => :devise_controller? 

Jeśli trzeba umieścić check_authorization w każdym kontrolerze ręcznie w pewnym momencie można zapomnieć i otworzyć dziurę w zabezpieczeniach aplikacji. Lepiej jawnie dodać do białej listy kontrolery, które nie wymagają uwierzytelnienia przez program Cancan.

to jasno w kankana docs na

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

EDIT

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 
+0

Dzięki bradgonesurfing +1. Kiedy wrócę do zmiany i przetestowania tego kodu, zmienię zaakceptowaną odpowiedź, jeśli wszystko pójdzie dobrze. – Jay

+0

Odpowiedź jest nadal z Mr Bigg, który jest oceniany na (-1) – bradgonesurfing

+0

Mam problem, że oprócz kontrolera devise istnieją jeszcze dwa inne kontrolery, które chciałbym pominąć. Nie mogłem zmodyfikować warunku "until", aby je dodać. Mogę umieścić w nich "skip_authorization_check", ale byłoby lepiej, gdyby w aplikacji była tylko jedna lokalizacja obsługująca wszystkie wyjątki. – Jay