2013-02-19 26 views
12

मैं रूबी में एक आरामदायक, जेसन एपीआई बनाने का प्रयास कर रहा हूं - इसलिए मैं रैक के अंदर अंगूर (https://github.com/intridea/grape) का उपयोग कर रहा हूं। मैं इस परियोजना के लिए रेल का उपयोग नहीं कर रहा हूं, इसलिए कैनकन, जादूगर, आदि ... सबसे अच्छे विकल्प प्रतीत नहीं होते हैं। इसके अलावा, मैं अंगूर के घोषणात्मक डीएसएल में अनिवार्य तर्क के गुच्छा में मिश्रण करने से नफरत करता हूं।{अंगूर} प्राधिकरण

जबकि अंगूर प्रमाणीकरण समर्थन में बनाया गया है, मुझे प्राधिकरण के बारे में कुछ भी दिखाई नहीं देता है। ऐसा लगता है कि यह एक सामान्य उपयोग मामला होगा जो इस सड़क से पहले यात्रा की गई थी, लेकिन Google और अंगूर कोडबेस स्वयं में कुछ सुंदर खुदाई के बाद मैंने कुछ भी नहीं किया है।

क्या किसी ने अंगूर में अपनी परियोजना के लिए ऐसा कुछ लागू किया है? आपने क्या उपयोग किया

उत्तर

2

मैंने सोचा कि मैं इस पर कम टिप्पणी दे सकते हैं, लेकिन क्षेत्र, खेद अगर यह सही जवाब नहीं होगा लेकिन कम करने के लिए है:

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

मौलिक सवाल आप से पूछना चाहिए अपने आप को है ...

कितना भूमिका आधारित प्रणाली विकसित करते हैं? मुझे लगता है कि अगर यह केवल सार्वजनिक/निजी/व्यवस्थापक भूमिकाओं का मामला है तो आपको इसे अलग-अलग एपीआई में ले जाने पर विचार करना चाहिए।

यह कुछ परिस्थितियों में बोझिल हो सकता है लेकिन जटिल नहीं होने के लिए कोई भी अतिरिक्त भूमिका नहीं है। अंगूर में सरल माउंट ओओटीबी समस्या को हल करेगा।

वास्तविक समस्या यह है कि यदि आप कुछ विस्तारणीय/गतिशील भूमिका प्रणाली के बारे में सोचते हैं या आप केवल DRY होना चाहते हैं। यह दर्दनाक हो सकता है ;-)। मुझे लगता है कि रेयान के बाइट्स मणि क्रियान्वयन कर सकते हैं, यह समझने में आपकी सहायता करनी चाहिए कि उच्च सार स्तर पर ऐसी समस्या कैसे हल की जा सकती है। विशेष रूप से (बिना उच्च अमूर्तता के - जैसे कि गतिशील भूमिकाएं) कार्यान्वयन, अंगूर से वर्तमान में दिए गए सहायकों का उपयोग करने के लिए ठीक होना चाहिए और मॉडल (मूल उपयोग) में उनकी जिम्मेदारियों का प्रतिनिधित्व करना ठीक होना चाहिए।

helpers do 
    def current_user 
    @current_user ||= User.authorize!(env) 
    end 

    def authenticate! 
    error!('401 Unauthorized', 401) unless current_user 
    end 
end 

इसलिए सभी कहानी कैसे User.authorize को लागू करने के बारे में है! (Env) और मुझे विश्वास है कि अपने मॉडल में किया जाना चाहिए और अपनी आवश्यकताओं पर सख्ती से निर्भर करता है।

1

मुझे नहीं पता कि मेरा जवाब आपके लिए समय पर है या नहीं। मुझे हाल ही में अंगूर और प्राधिकरण रेलवे 4 प्रोजेक्ट में एक ही समस्या है। और कोशिश करने के बाद, मुझे इसके लिए एक रास्ता पता चला। मेरी प्रोजेक्ट में, मैं प्राधिकरण के लिए उपयोग कर रहा हूं, यह मुझे नीति फ़ोल्डर बनाने के लिए कहता है, और प्रत्येक मॉडल के लिए अधिकृत नियम बनाते हैं, प्रत्येक नियम रूबी क्लास है, इस तरह कुछ (पंडित जिथब से पेज)

class PostPolicy < ApplicationPolicy 
    def update? 
    user.admin? or not record.published? 
    end 
end 

तो अंगूर एपीआई में, मैं सिर्फ इस वर्ग प्राधिकरण, इस तरह कोड के लिए उपयोग करें:

desc "hide a post" 
post :hide do 
    authenticate! 
    error!("user unauthorized for this") unless PostPolicy.new(current_user, @post).hide_post? 
    @post.update hidden: true 
    { hidden: @post.hidden } 
end 

authenticate! और current_user सहायकों अनुकूलित सहायकों रहे हैं। इस तरह, मैं वेबसाइट भागों को विकसित करते समय बनाए गए अधिकृत नियमों का पुन: उपयोग कर सकता हूं।

यह मेरे लिए काम करता है। आशा है कि पंडित रास्ता अंगूर प्राधिकरण

7

के लिए अपनी समस्याओं का समाधान कर सकते यह एक छोटे से बहुत देर हो चुकी है, लेकिन फिर भी हो सकता है। मैं आपको प्राधिकरण के लिए पंडित का उपयोग करने की सलाह दूंगा, यह घातक सरल है।

class API < Grape::API 
    format :json 

    helpers Pundit 
    helpers do 
    def current_user 
     resource_owner 
    end 
    end 

    mount FoosAPI 
end 
अब

आप एपीआई अंतिम बिंदुओं में, आप authorize foo, action? उपयोग करने के लिए के रूप में आप हमेशा रेल नियंत्रकों में करना होगा सक्षम होना चाहिए::

अपने अंगूर एपीआई अंतिम बिंदुओं में इसका इस्तेमाल करने के लिए आपको पंडित सहायकों को शामिल करने की आवश्यकता होगी
class FoosAPI < Grape::API 
    get ':id' do 
    foo = Foo.find(params[:id]) 
    authorize foo, :show? 
    present foo, with: FooEntity 
    end 
end 

उम्मीद है कि यह मदद करता है!

+0

अरे कली धन्यवाद, बस एक बात अधिकृत विधि के दूसरे परम वास्तव में एक प्रतीक है 'प्रमाणीकरण करें: foo,: शो' पहले परम प्रतीक, क्लास का नाम या का एक उदाहरण हो सकता है? कक्षा – juliangonzalez

+0

@JGonzalezD: अच्छा पकड़, इसे ठीक किया। धन्यवाद! – fengye87

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