В Authlogic, есть ли способ добавить условия в метод аутентификации? Я знаю, что с помощью find_by_login_method я могу указать другой метод для использования, но когда я использую этот метод, мне нужно передать другой параметр, поскольку метод find_by_login_method передает только параметр, который считается ' login_field.
Что мне нужно сделать, это проверить что-то, что связано с аутентичной моделью. Вот метод, который я хочу использовать
# make sure that the user has access to the subdomain that they are
# attempting to login to, subdomains are company names
def self.find_by_email_and_company(email, company)
user = User.find_by_email(email)
companies = []
user.brands.each do |b|
companies << b.company.id
end
user && companies.include?(company)
end
Но это не удается из-за того, что в метод find_by_email_and_company отправляется только один параметр.
Компания на самом деле является поддоменом, поэтому, чтобы получить его здесь, я просто помещаю его в скрытое поле в форме (единственный способ, которым я мог бы представить его для модели)
Есть ли способ, которым я могу каким-то образом переопределить ..?
Используя ответ ниже, я пришел к следующему:
Модель пользователя (User.rb)
def self.find_by_email_within_company(email)
# find the user
user = self.find_by_email(email)
# no need to continue if the email address is invalid
return false if user.nil?
# collect the subdomains the provided user has access to
company_subdomains = user.brands.map(&:company).map(&:subdomain)
# verify that the user has access to the current subdomain
company_subdomains.include?(Thread.current[:current_subdomain]) && user
end
Контроллер приложений
before_filter :set_subdomain
private
def set_subdomain
# helper that retreives the current subdomain
get_company
Thread.current[:current_subdomain] = @company.subdomain
end
Модель сеанса пользователя (UserSession.rb)
find_by_login_method :find_by_email_within_company
Я прочитал несколько вещей об использовании Thread.current и конфликтующих пространствах имен. Это отличное решение, которое сработало для меня, но я бы хотел услышать любые другие предложения до истечения срока действия награды, в противном случае +100 к Йенсу Фененбруку: )