Devise - Как запретить некоторым пользователям входить в систему?

105

Я использую Devise для аутентификации в своем приложении.

Как мне запретить определенным пользователям входить в систему - как отключить пользователя?

Димитар Вулджефф
источник
42
Это правильный вопрос, и его следует снова открыть - OP спрашивает: «Как запретить некоторым пользователям входить в систему?» С помощью devise .
Zabba 04

Ответы:

149

Делай это так:

Создайте столбец, названный is_activeдля Userмодели.

Затем добавьте в Userмодель приведенный ниже код :

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

ОБНОВИТЬ

Как отмечает Мэтт Хаггинс, теперь метод называется active_for_authentication?( Документация )

Забба
источник
21
Похоже, его переименовали в active_for_authentication?вместо просто active?.
Мэтт Хаггинс,
1
the method is now called active_for_authentication?означает, что имя вашего метода должно быть active_for_authentication?вместо active?.
fotanus
Важное примечание: active_for_authentication?метод должен быть общедоступным!
Mladen Jablanović
super and self.is_active?можно упростить доsuper && is_active?
Дэвид
17

Добавить столбец в Userмодели: allowed_to_log_in.

Затем добавьте это в /app/models/user.rb:

def active_for_authentication?
    super and self.allowed_to_log_in?
end

Если вы хотите проинформировать пользователя с помощью настраиваемого сообщения, вы также можете добавить это:

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

Я думаю, что это очень важно, потому что стандартное сообщение от Devise гласит:

"Ваша учетная запись еще не активирована."

Это сбивает пользователей с толку, и настоящая причина в том, что вы «запретили» им вход в систему.

Ойвква
источник
Я реализую функцию приостановки пользователя, которая работает, однако inactive_message «Ваша учетная запись в настоящее время заблокирована» отображается и для регистраций пользователей. Могу ли я иметь разные неактивные сообщения для активации новой учетной записи и приостановки действия пользователя?
Dercni 08
Спасибо за комментарий inactive_message.
Крис Фармер
0

Вы хотите выполнить авторизацию, а не аутентификацию. Однако Devise занимается только аутентификацией.
Т.е. devise только говорит вам, что пользователь - это тот, кем он себя называет.
Вам нужно что-то еще, чтобы запретить ему пользоваться сайтом.

Авторизация - популярная тема, и есть целый список драгоценных камней, которые могут вам в этом помочь:
http://ruby-toolbox.com/categories/rails_authorization.html
Выбирайте.

x10
источник
6
Я знаю разницу. Дело в том, что я хочу запретить пользователю входить в систему, не имея доступа к определенному контроллеру.
Димитар Вулджефф
-2

Похоже, вас может заинтересовать канкан

экологический
источник
1
Это не ответ на заданный вопрос. Большинство людей знают разницу между авторизацией и аутентификацией. Вопрос был в том, как сделать так, чтобы пользователь не мог войти в систему.
isaacsloan 02