Есть ли в Authlogic способ добавить условия к методу аутентификации? Я знаю, что с помощью find_by_login_method я могу указать другой метод для использования, но когда я использую этот, мне нужно передать другой параметр, поскольку метод find_by_login_method передает только параметр, который считается поле «логин_поле».
Что мне нужно сделать, так это проверить что-то, что является ассоциацией подлинной модели. Вот метод, который я хочу использовать
# 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 Йенсу Фаненбруку :)