2011-05-26 22 views
7

हैंडल करते हैं मैं रेल 3.0.7 के साथ 1.3.4 तैयार कर रहा हूं। मेरे पास दो तरीकों से उपयोगकर्ता साइन इन कर सकते हैं: वेब ऐप का उपयोग करके, और मोबाइल वेब ऐप (JSON API कॉल के माध्यम से) का उपयोग करना। पहला तरीका डिफ़ॉल्ट 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 

प्रयास Devise::Strategies::Authenticatable में valid_controller? विधि की वजह से असफल: तो, मैं इस तरह इस दूसरे नियंत्रक लिखा था। चूंकि मैंने उपयोगकर्ताओं के लिए मैप किए गए नियंत्रक के रूप में डिफ़ॉल्ट नियंत्रक (devise/sessions) छोड़ा है, यह मेरे कस्टम नियंत्रक से प्रमाणीकरण की अनुमति नहीं देता है।

मैं Devise::SessionsController के अपने खुद के उपवर्ग में मेरी कस्टम कार्यक्षमता रोल करना चाहते हैं, लेकिन मैं एपीआई सत्र API::BaseController विस्तार करने के लिए नियंत्रक की जरूरत , तो मैं Devise::SessionsController विस्तार नहीं कर सकते और साथ ही। मैं एपीआई नियंत्रक में काम कर रहे, डिफ़ॉल्ट-व्यवहार वेब-ऐप प्रमाणीकरण विधियों को नहीं रखना चाहता, खासकर क्योंकि इसे उन्हें डिवाइसेज नियंत्रक से कॉपी करने की आवश्यकता होगी।

कोई सुझाव? क्या कोई ऐसी कॉन्फ़िगरेशन है जो मुझे याद आ रही है जो कई नियंत्रकों को सत्रों को संभालने की अनुमति देती है? valid_controller? विधि == तुलना करता है, .include? नहीं, इसलिए मुझे नहीं लगता कि यह कैसे काम करेगा।

अद्यतन

यह एक भयानक अस्थायी समाधान है। मुझे यह पसंद नहीं है, इसलिए मैं इसे एक उत्तर के रूप में पोस्ट नहीं कर रहा हूं, लेकिन मैंने सोचा कि यह आपके उत्तर देने वाले सभी प्रकार के लिए भोजन-विचार-विचार की पेशकश कर सकता है:

मेरी निर्माण विधि के शीर्ष पर, मैं कर सकता था डेविस को सत्र नियंत्रक होने की उम्मीद है कि ओवरराइड करें।

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

इस वसीयत में प्रयोग किया जाने कार्यक्षमता के आसपास काम कर रहा है (एक एकल, विशिष्ट नियंत्रक की आवश्यकता होती है सत्र निर्माण करने के लिए) तो मैं इसे रखने के लिए नहीं करना चाहती। मुझे आश्चर्य है कि क्या यह बाधा एक सुरक्षा उपाय है या सिर्फ एक सम्मेलन है - यदि यह सुरक्षा के लिए है, तो यह संभवतः काफी खराब है।

उत्तर

1

मैं केवल एक और वैकल्पिक हल (शायद कम भयंकर?) एक प्रारंभकर्ता में आप #valid_controller अधिलेखित कर सकते हैं ?, इस तरह का सुझाव कर सकते हैं:

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

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

मैं भी इस बाधा का कारण जानने में दिलचस्पी होगी

+0

यह एक बहुत अच्छा विचार है। मेरे से निश्चित रूप से कम सकल। मैं 'valid_controller' में 'शामिल' करने के लिए तैयार करने की सोच रहा था और मेरे मार्गों की घोषणा में एक सरणी की आपूर्ति करता था। – andrewmitchell

0

मैं रेल 3.2.13 के साथ डेविस 2.2.7 का उपयोग कर रहा हूं। उपरोक्त दोनों विधियां मेरे लिए काम नहीं करतीं: valid_vontroller?Devise::Strategies::DatabaseAuthenticatable में विधि अब मौजूद नहीं है। Devise.mappings[:user].controllers[:sessions] चाल मेरे लिए भी काम नहीं करती थी।

this thread के माध्यम से खोदने के बाद मुझे valid_params_request? मिला जो यह सुनिश्चित करने के लिए ज़िम्मेदार है कि अनुरोध प्रमाणीकरण प्रणाली के माध्यम से भेजा जाना चाहिए। एक सहायक विधि है, allows_params_authentication!, जो प्रमाणीकरण अनुरोधों को संसाधित करने के लिए Devise::SessionsController को सक्षम बनाता है।

आप से किसी भी नियंत्रक से एक उपयोगकर्ता को प्रमाणित कर सकते हैं:

def signin 
    allow_params_authentication! 
    authenticate_user! 
end 

आप एक कस्टम पृष्ठ पर रीडायरेक्ट करना चाहते हैं जब प्रमाणीकरण विफल:

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

मैं बाहर प्रमाणीकरण से निपटने के लिए की जरूरत भर में आया था स्प्री कॉमर्स के साथ काम करने वाले इंजन को विकसित करके Devise::SessionsController का उप-वर्ग, जो पहले ही प्रमाणीकरण तैयार करता है।

संबंधित मुद्दे