Как добавить пользователей с электронной почтой только в Devise - PullRequest
6 голосов
/ 08 апреля 2011

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

Я могу добавить свои собственные параметры проверки, чтобы разрешить это, но я подозреваю, что это повлияет на работу остальной части Devise, если я начну добавлять пользователей без паролей или отмечать их в своем собственном незарегистрированном поле.

На данный момент самое простое решение, похоже, поместить этих пользователей в другую таблицу, но от этого немного пахнет. Есть идеи?

Ответы [ 2 ]

20 голосов
/ 08 апреля 2011

У меня есть приложение, которое делает нечто подобное - мы используем Open ID и OAuth исключительно для входа в систему, и хотя мы сохраняем адрес электронной почты пользователя (учетная запись Google или Facebook отправляет его обратно во время аутентификации), они никогда не входят в систему, используя его, и поэтому не не иметь / нужен пароль.

Это обратный вызов для того, что происходит, когда пользователь регистрируется через Facebook:

  User.create!( :facebook_id => access_token['uid'],
                :email => data["email"], 
                :name => data["name"], 
                :password => Devise.friendly_token[0,20])

Devise.friendly_token[...] просто генерирует случайный 20-значный пароль для пользователя, и мы используем нашу пользовательскую модель по умолчанию с devise просто отлично. Моим подходом будет установка пароля аналогичным образом для ваших пользователей, поскольку вы никогда не будете использовать их пароль. Кроме того, если вы когда-нибудь передумаете и захотите, чтобы они могли войти в систему, вы можете просто изменить пароль пользователя в базе данных и создать форму входа в систему, а devise позаботится обо всем остальном.

2 голосов
/ 01 мая 2013

Еще один вариант ответа Бретта - переопределить password_required? метод по модели User.

def password_required?
    super && provider.blank?
end

Если вы храните несколько провайдеров omniauth, то что-то вроде этого также должно работать.

def password_required?
    super && self.omniauth_credentials.empty?
end

Полный кредит Райкану Бейтсу на Devise и Omniauth за это решение: http://railscasts.com/episodes/235-devise-and-omniauth-revised

...