2015-09-04 3 views
1

Этот проект Rails имеет сторону API для отправки данных в версию приложения iOS. Он использует Devise :: Lockable для блокировки учетных записей пользователей, когда они терпят неудачу входа 3 раза.Rails: Персистские параметры по неавторизованному запросу?

Это странный кромка, но, возможно, не так уж редко: ситуация начинается с того, что уже вошел в систему на настольной версии. Если я затем проваляю логин в приложении iOS 3 раза, но затем нажмите ссылку для сброса пароля в своем письме с настольной версии, потому что я уже вошел в систему, запрос на edit_password_url становится несанкционированным (потому что учетная запись заблокирована), и я перенаправляюсь на страницу входа.

Какими-то способами я мог бы по-прежнему обращаться к edit_password_url, сохраняя параметры (в частности, токен сброса пароля)? Я имею в виду как:

  • Пропустить аутентичности страницу редактирования пароля (кажется плохой, но я до сих пор не понимаю, как это сделать)
  • Создать несколько серий фильтров, которые проверяют запросы затем перенаправить обратно к edit_password_url ... но как я могу сохранить этот пароль сброса токен?
  • В качестве альтернативы, я мог бы как-то принудительно выгнать пользователя из основного приложения где-то в процессе входа пользователя из-под входа через API. Но это имена, которые находятся под разными контроллерами, и я не нашел способа выгнать этот путь.

ответ

1

Есть несколько действий в разработке, где он перенаправляется, если есть активный сеанс. Мне никогда не нравилось это поведение и, как правило, переоценивать его. Если я ударил ссылку, это потому, что я хочу выполнить это действие, в конце концов.

Например, посетив ссылку входа, вы можете войти в систему как другой пользователь, чтобы вы могли переопределить это действие, чтобы выйти, если оно попало напрямую, а не перенаправляется. Так что для моего примера вы подкласс Devise::SessionsController

class SessionsController < Devise::SessionsController 
    skip_before_filter :require_no_authentication, only: [:new] 

    def new 
    if warden.authenticated?(resource_name) 
     sign_out 
    end 
    super 
    end 

    private 

    def sign_out 
    # From Devise::SessionsController#destroy 
    Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name) 
    end 
end 

и переопределить его в маршрутах:

devise_for :users, controllers: {sessions: 'sessions'} 
+0

Это так близко, и я думаю, что это будет работать, если я не использовал spree_auth_devise. Вы знакомы? Я хочу изменить свой контроллер паролей на то, что вы показали, но файл начинается следующим образом: 'Spree :: UserPasswordsController.class_eval do', а не' UserPasswordsController : edit', но он все еще аутентифицируется и перенаправляется. Есть идеи? – batmanbury

+0

Вы можете расширить 'Spree :: UserPasswordsController', но вам нужно использовать' skip_before_filter'. 'before_filter' (или лучше' before_action') не переопределяет предыдущие объявления ... Вы попробовали это? – aceofspades

+0

Я вижу. «Пропустить» часть кажется неинтуитивной. Итак: 'skip_before_filter: require_no_authentication, только: [: edit]' фактически пропустит аутентификацию? – batmanbury

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