В типичном приложении Rails информация аутентификации сохраняется в активном сеансе, а не в параметрах. Поэтому написать помощника, который делает то, что вы хотите, довольно просто.
Кажется довольно необычным создание модуля, который затем включается в ApplicationHelper. Традиционный подход заключается в создании отдельного помощника, который в этом случае, вероятно, будет называться AuthenticationHelper. Затем его можно включить в любые необходимые контроллеры или, если хотите, загрузить в ApplicationController, чтобы сделать его доступным повсеместно.
В общих чертах, помощники не должны включать других помощников. Лучше просто загрузить несколько помощников в данный контроллер.
Вспомогательные методы имеют полный доступ к любым переменным экземпляра, объявленным в контексте контроллера, из которого они работают. Точнее, это только переменные экземпляра (@name), а не локальные переменные (name). Вспомогательные методы также выполняются для определенного представления.
Кроме того, я не уверен, почему пользователь будет предоставлять учетные данные и выполнять операции на том же этапе, по крайней мере, для традиционных веб-приложений. Обычно процесс состоит в том, чтобы войти в систему и затем выполнить действие отдельно.
Однако в случае API, где каждая транзакция является независимой операцией, самый простой подход состоит в том, чтобы извлечь соответствующие параметры запроса, связанные с аутентификацией, установить некоторые переменные экземпляра контроллера и затем перейти к выполнению конкретный запрос с учетом ограничений, налагаемых учетными данными.
Подход, который я обычно применяю для такого рода вещей, состоит в том, чтобы наложить слой на структуру аутентификации в самом ApplicationController, который может выполнять необходимые проверки. Это защищенные методы.
Хотя заманчиво накатывать целую кучу таких, как can_edit_user? и can_create_group? они очень быстро выходят из-под контроля. Это более простой дизайн, чтобы положить в ловушку для общего назначения can_perform? или has_authority_to? метод, которому передается операция и все необходимые параметры.
Например, очень грубая реализация:
class ApplicationController < ActionController::Base
protected
def has_authority_to?(operation, conditions = { })
AuthenticationCheck.send(operation, conditions)
rescue
false
end
end
module AuthenticationCheck
def self.edit_user?(conditions)
session_user == conditions[:user]
end
end
class UserController
# ...
def edit
@user = User.find(params[:id])
unless (has_authority_to?(:edit_user, :user => @user))
render(:partial => 'common/access_denied', :status => :forbidden)
end
rescue ActiveRecord::RecordNotFound
render(:partial => 'users/not_found')
end
end
Очевидно, что вы захотите свернуть много проверок полномочий в блоки before_filter, чтобы избежать повторения и повысить согласованность.
Может быть полезен полный пример структуры, такой как система аутентификации пользователя Wristband:
http://github.com/theworkinggroup/wristband/tree/master