2013-09-13 4 views
3

UPDATE -Subdomain вход с Rails 4 и Придумайте 3.1.0

я рекомендовал бы пропустить прямой ответить раздел - цель это позволить несколько поддоменов, каждый из которых будет иметь свои собственные пользователей/регистраций , Регистрант мог зарегистрироваться на нескольких поддоменах, однако каждый поддомен обрабатывается независимо и не связан с другими.

Я чувствую, что эти вопросы по-прежнему нуждаются в лучшем ответе, поэтому, пожалуйста, внесите свой вклад в это.

===============

ОРИГИНАЛЬНЫЙ ПОСТ -

Помогите пожалуйста -

сценарий - Мой сайт используются: команды , каждый из которых имеет: пользователей. Я пытаюсь включить: пользователей войти в систему через поддомен: team. (Ключи уникальный индекс USER являются: электронная почта и: team_id - подобласть является частью отдельной модели ТИМ, что им пытаются связать по:. Team_id в модели пользователя во время входа в аккаунт)

КОМАНДА МОДЕЛЬ

has_many :users 

ПОЛЬЗОВАТЕЛЯ МОДЕЛЬ

devise request_keys: [:team_id] 
belongs_to :team 

def self.find_for_authentication(warden_conditions) 
    where(:email => warden_conditions[:email], :team_id => warden_conditions[:team_id]).first 
end 

это в новой инструкции по DEViSE вики: https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain

ПРИМЕНЕНИЕ CONTROLLER

Я использую before_action установить команду, основанную на подобласти Я также добавить сильный PARAMS в "ленивом" пути для team_id/devise_parameter_sanitizer.for (: sign_in) < <: team_id

DEViSE SESSIONS НОВОГО ВИДА (для пользователей)

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

и ошибка DUMP NoMethodError undefined method team_id

Started POST "https://stackoverflow.com/users/sign_in" for 111.0.0.1 at 2013-09-13 13:08:09 -0400 
Processing by Devise::SessionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"LONG TOKEN HERE=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "team_id"=>"16", "commit"=>"Sign in"} 
    [1m[35mTeam Load (0.2ms)[0m SELECT "teams".* FROM "teams" WHERE "teams"."subdomain" = 'teamname' LIMIT 1 
Completed 500 Internal Server Error in 119ms 

NoMethodError (undefined method `team_id' for #<ActionDispatch::Request:0x007ffe950c2150>): 
    devise (3.1.0) lib/devise/strategies/authenticatable.rb:142:in `block in request_values' 
    devise (3.1.0) lib/devise/strategies/authenticatable.rb:142:in `map' 
    devise (3.1.0) lib/devise/strategies/authenticatable.rb:142:in `request_values' 
    devise (3.1.0) lib/devise/strategies/authenticatable.rb:122:in `with_authentication_hash' 
    devise (3.1.0) lib/devise/strategies/authenticatable.rb:71:in `valid_for_params_auth?' 
    devise (3.1.0) lib/devise/strategies/authenticatable.rb:16:in `valid?' 
    warden (1.2.3) lib/warden/proxy.rb:351:in `block in _run_strategies_for' 
    warden (1.2.3) lib/warden/proxy.rb:349:in `each' 
    warden (1.2.3) lib/warden/proxy.rb:349:in `_run_strategies_for' 
    warden (1.2.3) lib/warden/proxy.rb:319:in `_perform_authentication' 
    warden (1.2.3) lib/warden/proxy.rb:127:in `authenticate!' 
    devise (3.1.0) app/controllers/devise/sessions_controller.rb:15:in `create' 
    actionpack (4.0.0) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
    actionpack (4.0.0) lib/abstract_controller/base.rb:189:in `process_action' 
    actionpack (4.0.0) lib/action_controller/metal/rendering.rb:10:in `process_action' 
    actionpack (4.0.0) lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
    activesupport (4.0.0) lib/active_support/callbacks.rb:463:in `_run__412684316733059520__process_action__callbacks' 
    activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks' 
    actionpack (4.0.0) lib/abstract_controller/callbacks.rb:17:in `process_action' 
    actionpack (4.0.0) lib/action_controller/metal/rescue.rb:29:in `process_action' 
    actionpack (4.0.0) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
    activesupport (4.0.0) lib/active_support/notifications.rb:159:in `block in instrument' 
    activesupport (4.0.0) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    activesupport (4.0.0) lib/active_support/notifications.rb:159:in `instrument' 
    actionpack (4.0.0) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
    actionpack (4.0.0) lib/action_controller/metal/params_wrapper.rb:245:in `process_action' 
    activerecord (4.0.0) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
    actionpack (4.0.0) lib/abstract_controller/base.rb:136:in `process' 
    actionpack (4.0.0) lib/abstract_controller/rendering.rb:44:in `process' 
    actionpack (4.0.0) lib/action_controller/metal.rb:195:in `dispatch' 
    actionpack (4.0.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
    actionpack (4.0.0) lib/action_controller/metal.rb:231:in `block in action' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:80:in `call' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:80:in `dispatch' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:48:in `call' 
    actionpack (4.0.0) lib/action_dispatch/routing/mapper.rb:44:in `call' 
    actionpack (4.0.0) lib/action_dispatch/journey/router.rb:71:in `block in call' 
    actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in `each' 
    actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in `call' 
    actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:655:in `call' 
    warden (1.2.3) lib/warden/manager.rb:35:in `block in call' 
    warden (1.2.3) lib/warden/manager.rb:34:in `catch' 
    warden (1.2.3) lib/warden/manager.rb:34:in `call' 
    rack (1.5.2) lib/rack/etag.rb:23:in `call' 
    rack (1.5.2) lib/rack/conditionalget.rb:35:in `call' 
    rack (1.5.2) lib/rack/head.rb:11:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/flash.rb:241:in `call' 
    rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context' 
    rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/cookies.rb:486:in `call' 
    activerecord (4.0.0) lib/active_record/query_cache.rb:36:in `call' 
    activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call' 
    activerecord (4.0.0) lib/active_record/migration.rb:369:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
    activesupport (4.0.0) lib/active_support/callbacks.rb:373:in `_run__1066722413265567725__call__callbacks' 
    activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks' 
    actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/reloader.rb:64:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged' 
    activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged' 
    railties (4.0.0) lib/rails/rack/logger.rb:21:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.5.2) lib/rack/runtime.rb:17:in `call' 
    activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:in `call' 
    rack (1.5.2) lib/rack/lock.rb:17:in `call' 
    actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call' 
    railties (4.0.0) lib/rails/engine.rb:511:in `call' 
    railties (4.0.0) lib/rails/application.rb:97:in `call' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:145:in `handle' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:99:in `rescue in block (2 levels) in start' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:96:in `block (2 levels) in start' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:86:in `each' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:86:in `block in start' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:66:in `loop' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:66:in `start' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/lib/nack/server.rb:13:in `run' 
    /Users/Home/Library/Application Support/Pow/Versions/0.4.1/node_modules/nack/bin/nack_worker:4:in `<main>' 

Помощь очень ценится. Благодаря!

ответ

1

Вот как я решен -

Я следовал инструкциям здесь точно: https://github.com/plataformatec/devise/wiki/How-to:-Scope-login-to-subdomain

Чтобы использовать эти инструкции я добавил столбец поддомена в таблице пользователей (создание множества повторяющихся подобластей, так как каждая команда has_many users).

Затем в моем контроллере Team, когда я обновляю поддомен команды, он также создает запрос, чтобы собрать всех пользователей, связанных с командой, для обновления своих значений поддоменов. Не идеальное решение, но работает достаточно хорошо.

UPDATE

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

validates_uniqueness_of :email, :scope => :subdomain 

Для этой работы вам нужно удалить: подтверждаемые из вариантов DEViSE в модели пользователя и создавать свои собственные валидаций для электронной почты и паролей.

+0

Yikes, я не поклонник этого типа денормализацию, но я не нашел лучший способ себя. –

+0

Я следую той же статье в вики, используя Rails 4 и Mongoid, но метод 'find_for_authentication' даже не кажется вызванным. – Dex

0

Нет необходимости добавлять столбцы «субдомен» в таблицу DB. Например, в моем случае мне нужно предоставить аутентификацию с «www» только для клиентов, а из «учетной записи» только для партнеров.

def self.find_for_authentication(conditions) 
    subdomain = conditions.delete(:subdomain) 
    if user = super 
    case subdomain 
    when 'www' 
     user.client? ? user : nil 
    when 'account' 
     user.partner? ? user : nil 
    else 
     nil 
    end 
    end 
end 

Я думаю, что этот подход более простой.

0

Я считаю, что это на самом деле ошибка, связанная с изменением способа работы ActionDispatch :: Request.

Devise, похоже, полагает, что если он вызывает ключ на хеше запроса, он будет равен нулю, если значение не существует и получит значение в противном случае.

Он пытается получить доступ к запросу с .send, который, похоже, не работает в текущей версии рельсов. Если вы исправляете такой вариант:

diff --git a/lib/devise/strategies/authenticatable.rb b/lib/devise/strategies/authenticatable.rb 
index 13249e8..df28fc9 100644 
--- a/lib/devise/strategies/authenticatable.rb 
+++ b/lib/devise/strategies/authenticatable.rb 
@@ -148,7 +148,7 @@ module Devise 

     def request_values 
     keys = request_keys.respond_to?(:keys) ? request_keys.keys : request_keys 
-  values = keys.map { |k| self.request.send(k) } 
+  values = keys.map { |k| self.request[k] } 
     Hash[keys.zip(values)] 
     end 

кажется, все хорошо работает.

Edit: Я написал частичный патч с несколько более подробно здесь: https://github.com/plataformatec/devise/pull/3965

Смежные вопросы