2013-04-07 3 views
32

Używam funkcji tworzenia i tworzenia pola użytkownika o nazwie: active, które ma wartość true lub false. Muszę ręcznie uczynić użytkownika aktywnym (true), zanim użytkownik będzie mógł się zalogować. Przynajmniej takie jest działanie. Próbowałem to ...Sprawdź, czy użytkownik jest aktywny przed zezwoleniem użytkownikowi na logowanie za pomocą narzędzia devise (szyn)

class SessionsController < Devise::SessionsController 
    # POST /resource/sign_in 
    def create 
    "resource/signin CREATE" 
    self.resource = warden.authenticate!(auth_options) 
    unless resource.active? 
     sign_out 
     redirect_to :sorry_not_active_url 
     return 
    end 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
end 

Jednak to nie złapać wszystkie miejsca, w których użytkownik może zalogować się, na przykład, gdy użytkownik zmieni swoje hasło, strona automatycznie rejestruje je automatycznie po. Jeśli jednak użytkownik nie jest aktywny, nie chcę, aby zezwolono mu na logowanie, ale powinien zostać przekierowany do strony sorry_not_active_url.

Jaki byłby najlepszy sposób uniemożliwienia użytkownikowi zalogowania się, jeśli użytkownik nie jest aktywny?

Dziękuję.

Odpowiedz

73

Dodaj te dwie metody do modelu użytkownika, opracowania powinien odebrać je automatycznie - nie ma potrzeby, aby przedłużyć Devise::SessionsController

def active_for_authentication? 
    super && self.your_method_for_checking_active # i.e. super && self.is_active 
end 

def inactive_message 
    "Sorry, this account has been deactivated." 
end 
+0

To świetnie! czy istnieje sposób sprawdzenia różnych stanów, np. aktywnych, nieaktywnych, oczekujących, odrzuconych przez utworzenie pola z 4 różnymi wartościami i dostarczenia innego komunikatu dla każdego stanu? – user2012677

+1

po zastanowieniu się, zakładam, że mogę uczynić def inactive_message odwołanie pola, a pole może mieć niestandardową wiadomość na użytkownika. Czy to wydaje się być poprawne? – user2012677

+0

Wygląda na to, że zadziała – house9

3

opracować (Jeśli trzeba opracować 3.2 lub nowszym) obsługują obecnie block parametru (Session) Utwórz

# assuming this is your session controller 

class SessionsController < Devise::SessionsController 

def create 
    super do |resource| 
    unless resource.active? 
     sign_out 
     # you can set flash message as well. 
     redirect_to :sorry_not_active_url 
     return 
    end 
    end 
end 
+0

Witam Virenie, czy mógłbyś wymienić kilka korzyści, aby zrobić to w ten sposób, w przeciwieństwie do implementacji w zaakceptowanej odpowiedzi? Teraz chciałbym to wdrożyć i zastanawiam się, jaka jest najlepsza praktyka. Dzięki. – Marklar

+1

@Marklar Może to być przydatne, gdy wspierasz wiele strategii uwierzytelniania i musisz wyłączyć przepływ zwykłego uwierzytelniania, ale nie dla wszystkich. Chociaż przypadek użycia OP służy do sprawdzania, czy użytkownik jest aktywny, musiałem wyłączyć regularne tworzenie sesji, jeśli użytkownik został uwierzytelniony za pomocą innej metody (np. OAuth). Podejście oparte na modelu z użyciem 'aktywnego_do_autoryzacji?' Byłoby trudniejsze. – sp89