Я использую устройство 1.3.4 с рельсами 3.0.7. У меня есть два способа входа в систему: с помощью веб-приложения и с помощью мобильного веб-приложения (с помощью вызова API JSON). Первый способ прекрасно обрабатывается контроллером сессий devise по умолчанию. API-метод вызова аутентификации должен быть в контроллере, который расширяет мой Api::BaseController
. Итак, я написал этот второй контроллер так:
class Api::UserSessionsController < Api::BaseController
…
def create
user = warden.authenticate(:scope => :user)
if user
sign_in(:user, user)
else
# Do some error handling
end
end
end
Попытка входа в систему с помощью этого метода не удалась из-за метода valid_controller?
в Devise::Strategies::Authenticatable
. Поскольку я оставил контроллер по умолчанию (devise/sessions
) в качестве сопоставленного контроллера для пользователей, он не разрешает аутентификации с моего пользовательского контроллера.
Я хотел бы свернуть свои пользовательские функции в свой собственный подкласс Devise::SessionsController
, но мне нужен контроллер сессий API для расширения API::BaseController
, поэтому я не могу расширить Devise::SessionsController
как Что ж. Я не хочу помещать рабочие методы аутентификации веб-приложений с поведением по умолчанию в контроллер API, особенно потому, что для этого потребуется скопировать их из контроллера devise.
Есть предложения? Не хватает ли какой-нибудь конфигурации, которая позволяет нескольким контроллерам обрабатывать сессии? valid_controller?
метод выполняет сравнение ==
, а не .include?
, поэтому я не понимаю, как это будет работать.
UPDATE
Это ужасный временный обходной путь. Мне это не нравится, поэтому я не публикую его в качестве ответа, но я подумал, что он может предложить пищу для размышлений всем вам, кто отвечает:
В верхней части моего метода create я мог переопределить то, что Devise ожидает от контроллера сессий.
Devise.mappings[:user].controllers[:sessions] = params[:controller]
Это работает вокруг предполагаемой функциональности Devise (требуется один, определенный контроллер для создания сеанса), поэтому я не хочу его сохранять. Интересно, является ли это ограничение мерой безопасности или просто условием - если это касается безопасности, то, по-видимому, это довольно плохо.