2014-09-26 5 views
8

मेरे पास एक छोटा फीनिक्स एप्लिकेशन है जो उपयोगकर्ताओं को लॉगिन करने और उनकी प्रोफ़ाइल से परामर्श करने की अनुमति देता है। मैं निम्नलिखित सरल मार्ग का प्रयोग किया:फीनिक्स में कुछ मार्गों तक पहुंच प्रतिबंधित कैसे करें?

resources "/users", MyApp.UserController 

लेकिन इस :index कार्रवाई के माध्यम से उपयोगकर्ताओं की सूची देखने के प्रत्येक उपयोगकर्ता के लिए, साथ ही हटा सकते हैं या किसी भी उपयोगकर्ता को अद्यतन अनुमति देता है।

केवल व्यवस्थापक तक पहुंच प्रतिबंधित करने का सबसे आसान तरीका क्या है? क्या मुझे हर कार्रवाई के सामने एक चेक जोड़ना चाहिए? या मुझे "/admin" संसाधन बनाना चाहिए जो उन परिचालनों को संभालेगा? अनुशंसित तरीका क्या है?

उत्तर

11

आप UserController में एक प्लग का उपयोग करेंगे। एक

defmodule MyApp.UserController do 
    use Phoenix.Controller 

    plug :authenticate, :admin when action in [:create, :update, :destroy] 

    def index(conn, _) do 
    render conn, "index" 
    end 

    def create(conn, params) do 
    # do the creating 
    end 
    ... 

    defp authenticate(conn, :admin) do 
    if AdminAuth.authenticated?(conn) do 
     conn 
    else 
     halt conn 
    end 
    end 
end 

यह है: 0.4.x सशर्त रों प्लग के लिए कोई क्षमता है, लेकिन आप प्राप्त कर सकते थे क्या तुम कुछ की तरह साथ हैं:

defmodule MyApp.UserController do 
    use Phoenix.Controller 

    plug :authenticate, :admin 
    plug :action 

    def index(conn, _) do 
    render conn, "index" 
    end 

    def create(conn, params) do 
    # do the creating 
    end 
    ... 

    defp authenticate(conn, :admin) do 
    do_auth(conn, action_name(conn)) 
    end 
    defp do_auth(conn, action) when action in [:create, :update, :destroy] do 
    if AdminAuth.authenticated?(conn) do 
     conn 
    else 
     halt conn 
    end 
    end 
    defp do_auth(conn, _action), do: conn 
end 

परिवर्तन 0.5 में जल्द ही आ रहा आसान सशर्त प्लग की अनुमति देगा, यानी अपने नियंत्रकों को सार्वजनिक/प्रतिबंधित पहुंच के लिए अलग रखने का अच्छा विचार है, इसलिए मैं Admin.UserController जोड़ दूंगा जैसे आपने प्रतिबंधित कार्यक्षमता के संदर्भ में किया है।

+0

अच्छा! यह बढ़िया काम करता है। मैं अंतर्निहित हूं कि प्लग के साथ कुछ करना था, जो मैंने फीनिक्स के उदाहरण में पढ़ा था। नियंत्रक एपीआई डॉक्टर, लेकिन मुझे यकीन नहीं था कि यह अंतिम उपयोगकर्ताओं द्वारा लागू किया जाना था, या यदि यह कोर के लिए था डेवलपर्स। वैसे, क्या कनेक्शन स्रोत डोमेन को कॉन से निकालने का कोई तरीका है? मैं एसएसओ लॉगिन सफलता के मामले में कॉलिंग यूआरएल (विभिन्न तर्कों के साथ) पर रीडायरेक्ट करना चाहता हूं ... – adanselm

1

तुम भी प्रमाणीकृत अंतिम बिंदुओं के लिए एक अलग पाइप लाइन निर्धारित कर सकते हैं:

defmodule MyApp.Router do 
    use MyApp.Web, :router 

    pipeline :admin do 
    plug :accepts, ["html"] 

    plug Authentication # this represents some plug that provides authentication 
    end 

    scope "/", MyApp do 
    pipe_through :browser 

    resources "/things", ThingController 
    end 

    scope "/admin", MyApp do 
    pipe_through :admin 

    resources "/admin/things", Admin.ThingsController 
    end 
end 

व्यवस्थापक गुंजाइश सिर्फ एक उदाहरण है, यह कुछ भी आप की तरह हो सकता है, लेकिन पाइप लाइन विचार लगातार बनी हुई है।

यह तकनीक आपके नियंत्रकों को क्लीनर रखेगी, लेकिन हमेशा संभव नहीं है। यह आपकी सटीक आवश्यकताओं पर निर्भर करता है।

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

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