Добавить условие субдомена в запрос сброса пароля в Devise с Rails3? - PullRequest
4 голосов
/ 05 мая 2011

Я настроил Devise (на Rails 3) для использования аутентификации поддоменов в стиле Basecamp.Согласно этой модели, пользователь может быть зарегистрирован дважды в разных поддоменах с одним и тем же адресом электронной почты.

Например:

class User < ActiveRecord::Base
  belongs_to :account
end

class Account < ActiveRecord::Base
  # subdomain attribute stored here
end

Пользователь 1 зарегистрирован на company1.myapp.com с адресом электронной почты bob@acme.com
Пользователь 2 зарегистрирован на company2.myapp.com с адресом электронной почты bob@acme.com

(обе учетные записи контролируются одним и тем же человеком, но принадлежат разным поддоменам.)

Вход в систему работаетхорошо, но стандартный сброс пароля выполняется только по адресу электронной почты, поэтому вы можете сбросить пароль только для Пользователь 1 .Я хотел бы принять во внимание поддомен запроса, поэтому сброс пароля с company2.myapp.com/password/new приведет к сбросу пароля для Пользователь 2 .

.Devise ищет пользователя с помощью метода find_first, который, я не думаю, принимает соединения, поэтому я не могу включить условие :account => {:subodmain => 'comapny2'}.

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

Есть ли лучший способ?

Ответы [ 3 ]

1 голос
/ 09 января 2013

Мы столкнулись с такой же проблемой.Ответ Майка Мазура сработал, но с одним отличием: мы включили :reset_password_keys => [:email, :subdomain] в вызов метода devise в нашей модели Users.

1 голос
/ 08 мая 2014

Я недавно реализовал это поведение в приложении Rails 4.

… / config / initializers / devise.rb

(…)
# ==> Configuration for :recoverable
#
# Defines which key will be used when recovering the password for an account
config.reset_password_keys = [:email, :subdomain]
(…)

… / app / views / devise / passwords / new.html.erb

(…)
<%= f.input :subdomain, required: true %>
(…)

… / app / controllers / users / passwords_controller.rb

class Users::PasswordsController < Devise::PasswordsController

  def resource_params
    params.require(:user).permit(:email, :subdomain, ...)
  end

  private :resource_params
end
1 голос
/ 05 мая 2011

Похоже, что это может быть настроено с помощью devise_for в файле маршрутов.

Из моего чтения источника (и я на самом деле не пробовал это), вы можете добавить опцию reset_password_keys,Они должны включать поддомен.Это передается в find_or_initialize_with_errors из send_reset_password_instructions в lib/devise/models/recoverable.rbfind_or_initialize_with_errors это только эти ключи, которые используются для поиска ресурса .

Возможно, вы также захотите переопределить шаблон Devise::PasswordsController#new, чтобы включить субдомен пользователя при отправке сброса.запрос пароля.

ОБНОВЛЕНИЕ : чтобы учесть тот факт, что поддомен хранится в учетной записи и пользователе belongs_to :account, вы, вероятно, можете использовать Rails 'delegate метод .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...