Opracowanie - jak zabronić niektórym użytkownikom logowania się?

105

Używam Devise do uwierzytelniania w mojej aplikacji.

Jak zabronić niektórym użytkownikom logowania się - rodzaj wyłączenia użytkownika?

Dimitar Vouldjeff
źródło
42
Jest to ważna kwestia i powinny zostać wznowione - PO pyta: „Jak mogę zabronić niektórym użytkownikom logowanie się” za pomocą devise .
Zabba

Odpowiedzi:

149

Zrób to tak:

Utwórz kolumnę o nazwie is_activedla Usermodelu.

Następnie dodaj poniższy kod do Usermodelu:

class User < ActiveRecord::Base
  #this method is called by devise to check for "active" state of the model
  def active_for_authentication?
    #remember to call the super
    #then put our own check to determine "active" state using 
    #our own "is_active" column
    super and self.is_active?
  end
end

AKTUALIZACJA

Jak zauważa Matt Huggins, metoda nazywa się teraz active_for_authentication?( Dokumentacja )

Zabba
źródło
21
Wygląda na to, że ta nazwa została zmieniona na active_for_authentication?zamiast tylko active?.
Matt Huggins
1
the method is now called active_for_authentication?oznacza, że ​​nazwa metody powinna być active_for_authentication?zamiast active?.
fotanus,
Ważna uwaga: active_for_authentication?musi być metodą publiczną!
Mladen Jablanović
super and self.is_active?można uprościć dosuper && is_active?
David
17

Dodaj kolumnę do Usermodelu:allowed_to_log_in .

Następnie dodaj to do /app/models/user.rb:

def active_for_authentication?
    super and self.allowed_to_log_in?
end

Jeśli chcesz poinformować użytkownika niestandardową wiadomością, możesz również dodać to:

def inactive_message
    "You are not allowed to log in."
end

Myślę, że jest to dość ważne, ponieważ standardowa wiadomość od Devise mówi:

"Twoje konto nie zostało jeszcze aktywowane."

Jest to mylące dla użytkowników, a prawdziwym powodem jest to, że „zablokowałeś” im logowanie.

Oyvkva
źródło
Wdrażam funkcję zawieszania użytkowników, która działa, jednak komunikat inactive_message "Twoje konto jest obecnie zawieszone" jest wyświetlany również w przypadku rejestracji użytkowników. Czy mogę otrzymać różne nieaktywne wiadomości dotyczące aktywacji nowego konta i zawieszenia użytkownika?
Dercni
Dzięki za komentarz inactive_message.
Chris Farmer
0

Chcesz przeprowadzić autoryzację, a nie uwierzytelnianie. Jednak tylko Devise dokonuje uwierzytelnienia.
To znaczy wymyślenie mówi tylko, że użytkownik jest tym, za kogo się podaje.
Potrzebujesz czegoś innego, aby zabronić mu korzystania z witryny.

Autoryzacja to popularny temat i jest cała lista perełek, które mogą Ci w tym pomóc:
http://ruby-toolbox.com/categories/rails_authorization.html
Wybieraj.

x10
źródło
6
Znam różnicę. Chodzi o to, że chcę zabronić użytkownikowi logowania się, nie uzyskując dostępu do określonego kontrolera.
Dimitar Vouldjeff