2011-05-26 14 views
7

1.3.4'ü raylarla birlikte çalıştırıyorum. Kullanıcıların oturum açabileceği iki yol var: web uygulamasını kullanarak ve bir mobil web uygulaması kullanarak (bir JSON API çağrısı aracılığıyla). İlk yol varsayılan düzenleme oturumları denetleyicisi tarafından mükemmel şekilde ele alınır. API çağrısı kimlik doğrulama yönteminin, Api::BaseController'umu genişleten bir denetleyicide olması gerekir. Bu yöntemle girişDevise: Birden çok denetleyicinin kullanıcı oturumlarını ele almasını sağlayın

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 

girişimleri Devise::Strategies::Authenticatable yılında valid_controller? yönteme bağlı başarısız: Yani böyle bu ikinci kontrolör yazdı. Varsayılan denetleyiciyi (devise/sessions) kullanıcılar için eşlenen denetleyici olarak bıraktığımdan, özel denetleyicimden kimlik doğrulamasına izin vermez.

Ben Devise::SessionsController benim kendi alt sınıf içine benim özel işlevler rulo istiyorum amaAPI::BaseController uzatmak için API oturumları denetleyicisi ihtiyaç , bu yüzden de Devise::SessionsController uzatamaz. Özellikle denetleyici denetleyicisinden bunları kopyalamayı gerektirdiği için, API denetleyicisindeki çalışma, varsayılan davranış web uygulama kimlik doğrulama yöntemlerini yerleştirmek istemiyorum.

Herhangi bir öneriniz var mı? Birden fazla denetleyicinin oturumları işlemesine izin veren bazı yapılandırmalar var mı? valid_controller? yöntemi, .include? değil, == karşılaştırması yapar, dolayısıyla bunun nasıl olacağını göremiyorum.

GÜNCELLEME

Bu korkunç geçici bir çözümdür. Bunu sevmiyorum, bu yüzden bir cevap olarak yayınlamıyorum, ama tüm cevaplayıcı türleri için düşünce için yiyecek önerebileceğini düşündüm:

Oluşturma yöntemimin en üstünde Devise'nin oturum denetleyicisi olmasını beklediğini geçersiz kıl.

Devise.mappings[:user].controllers[:sessions] = params[:controller] 

Bu

hazırlamak amaçlanan işlevselliği etrafında çalışmaktadır (oturum oluşturma yapmak için tek ve belirli denetleyici gerektiren) bu yüzden tutmak istemiyoruz. Bu kısıtlamanın bir güvenlik önlemi mi yoksa sadece bir kongre mi olduğunu merak ediyorum - eğer güvenlik içinse, bu muhtemelen oldukça kötü.

cevap

1

Sadece bu gibi #valid_controller üzerine yazabilirsiniz bir başlatıcı olarak başka bir çözüm (belki daha az korkunç?) ?, önerebilirsiniz:

require 'devise/strategies/authenticatable' 
require 'devise/strategies/database_authenticatable' 

class Devise::Strategies::DatabaseAuthenticatable 
    def valid_controller? 
    # your logic here 
    true 
    end 
end 

Ben de bu kısıtlama nedenini bilerek ilgi duyarım

+0

Bu oldukça iyi bir fikir. Kesinlikle benimkinden daha az brüt. 'Valid_controller' içinde '.include?' Yapmak için yaya yollarını çizmeyi düşünüyordum ve güzergah bildirimlerimde bir dizi sağladım. – andrewmitchell

0

Raise 3.2.13 ile Devise 2.2.7 kullanıyorum. Yukarıdaki yöntemlerin ikisi de benim için çalışmadı: Devise::Strategies::DatabaseAuthenticatable'daki valid_vontroller? yöntemi artık mevcut değil. Devise.mappings[:user].controllers[:sessions] hile de benim için işe yaramadı.

this thread'dan kazandıktan sonra, isteğin kimlik doğrulama sistemi aracılığıyla gönderilmesini sağlamaktan sorumlu olan valid_params_request? numaralı telefonu buldum. Kimlik doğrulama isteklerini işlemek için Devise::SessionsController sağlayan bir yardımcı yöntem, allows_params_authentication! vardır.

Sen tarafından herhangi denetleyicisinden bir kullanıcının kimliğini doğrulamak için

:

resource = warden.authenticate!({ 
    :scope => :user, 
    :recall => "#{controller_path}#login" 
}) 
sign_in(:user, resource) 

dışarıda kimlik kullanımı ihtiyacı rastladı: Kimlik doğrulama başarısız olduğunda özel bir sayfaya yönlendirme istiyorsanız

def signin 
    allow_params_authentication! 
    authenticate_user! 
end 

daha önce bir tasarım geliştiren Spree Commerce ile birlikte çalışan bir motor geliştirerek Devise::SessionsController alt sınıfı.