2014-09-26 17 views
8

Kullanıcıların profillerine giriş yapmalarına ve onlara danışmaları için küçük bir Phoenix uygulamasına sahibim. Aşağıdaki basit rotayı kullandı:Phoenix'te belirli rotalara erişim nasıl kısıtlanır?

resources "/users", MyApp.UserController 

Ama bu her kullanıcının :index eylem aracılığıyla kullanıcıların listesini görmek yanı sıra silmek veya herhangi bir kullanıcının güncellemesine olanak tanır.

Yalnızca yöneticilere erişimi kısıtlamanın en kolay yolu nedir? Her eylemin önüne bir çek eklemeli miyim? Veya bu işlemleri halledecek bir "/admin" kaynağı mı oluşturmalıyım? Önerilen yol nedir?

cevap

11

UserController'da bir fiş kullanırsınız. 0.4.x şartlı s fişi için bir yeteneği vardır, ama sen bir şey gibi ile istediğinizi elde edebiliriz:

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 

değişiklikler daha kolay koşullu fişleri sağlayacak 0.5 yakında geliyor, yani:

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 

Bu bir Denetleyicilerinizi genel/kısıtlı erişim için ayrı tutmak için iyi bir fikir, bu yüzden kısıtlı işlevsellik için başvuru yaptığınız gibi bir Admin.UserController eklerim. Bu sizin gibi herhangi bir şey olabilir

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 

yönetici kapsamı sadece bir örnektir, ama boru hattı fikri tutarlı kalır:

+0

Güzel! İyi çalışıyor. Ben Phoenix.Controller api doc örneğinde okuduğumda verilen fişi ile ilgisi vardı, ama son kullanıcılar tarafından uygulanmasının amaçlandığından emin değildim ya da çekirdek için ise geliştiricileri. Bu arada, bağlantı kaynağı etki alanını bağlayıcıdan çıkarmak için bir yol var mı? Sso giriş başarısı durumunda çağıran url'ye (farklı argümanlarla) yönlendirmek istiyorum ... – adanselm

1

Ayrıca doğrulanmış uç noktaları için ayrı boru hattı tanımlayabiliriz.

Bu teknik, denetleyicilerinizi temiz tutacaktır, ancak her zaman mümkün değildir. Tam gereksinimlerinize bağlıdır.

İlgili konular