2013-02-19 39 views
12

Próbuję stworzyć spokojny, json api w ruby ​​- więc używam winogron (https://github.com/intridea/grape) wewnątrz Rack. Nie używam Railsów do tego projektu, więc cancan, czary itp. Nie wydają się być najlepszymi opcjami. Poza tym nie chciałbym mieszać w gromadę imperatywnej logiki z deklaratywnym DSL winogron.{grape} authorization

Podczas gdy winogron ma wbudowane wsparcie uwierzytelniania, nie widzę nic na temat autoryzacji. Wygląda na to, że byłby to dość powszechny przypadek, że droga ta byłaby wcześniej podróżowana, ale po kilku całkiem dokładnych wykopaliskach w google i samej bazie winogron nie znalazłem nic.

Czy ktoś wprowadził coś takiego do swojego projektu w winogron? Z czego korzystałeś?

Odpowiedz

2

myślałem mogę dać krótki komentarz w tej sprawie, ale pole jest krótki, przepraszam, jeśli to nie będzie prawidłowa odpowiedź, ale:

Wspomniałeś czary - Myślę, że to system uwierzytelniania i nie ma nic wspólnego z autoryzacją. (Nie znam implementacji gem magii - po prostu powtarzam instrukcję z dokumentacji i zakładam, że opis wylicza takie systemy, które zastępuje i jest to poprawna definicja). Sądzę, że to po prostu pomyłka.

fundamentalne pytanie należy sobie zadać jest ...

Ile System oparty na rolach czy rozwijać? Myślę, że jeśli jest to tylko kwestia ról publicznych/prywatnych/administracyjnych, powinieneś rozważyć przeniesienie go do różnych interfejsów API.

To może być uciążliwe w pewnych okolicznościach, ale warte spróbowania dla nieskomplikowanych żadnych addytywnych ról. Prosty montaż w gronie rozwiąże problem OOTB.

Prawdziwy problem polega na tym, że myślisz o rozszerzalnym/dynamicznym systemie ról lub chcesz być po prostu SUCHĄ. To może być bolesne ;-). Myślę, że wdrożenie klejnotów Rayana Bajtów pomoże ci zrozumieć, jak można rozwiązać ten problem na wyższym abstrakcyjnym poziomie. W przypadku konkretnej (bez większej abstrakcji - takiej jak dynamiczne role) wdrożenie powinno być w porządku, aby używać obecnie dostępnych pomocników z winogron i delegować swoje obowiązki na model (podstawowe użycie).

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

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

więc cała historia jest o tym, jak wdrożyć User.authorize! (Env) i uważam, że powinno być zrobione w modelu i zależy ściśle od potrzeb.

1

Nie wiem, czy moja odpowiedź jest na czas dla Ciebie. Ostatnio miałem ten sam problem z Grape i autoryzacją w projekcie Rails4. A po spróbowaniu znalazłem sposób na to. W moim projekcie korzystam z pundit dla autoryzacji, prosi mnie o utworzenie folderu polisy autoryzacji dla każdego Modelu, każda reguła jest klasą Ruby, coś podobnego (od pithit Github strona)

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

następnie w API winogron, po prostu użyć tej klasy w celu uzyskania zezwolenia, kod jak poniżej:

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 

się authenticate! i current_user pomocnicy są dostosowane pomocników. W ten sposób mogę ponownie użyć reguł autoryzacji utworzonych podczas tworzenia części strony.

To działa dla mnie. Nadzieję, że Pundit sposób można rozwiązać problemy o zezwolenie Grape

7

To może być trochę za późno, ale w każdym razie. Zalecam użycie do autoryzacji Pundit, jest to śmiertelnie proste. Aby użyć go w winogron API punktów końcowych, trzeba by to pomocników ekspert:

class API < Grape::API 
    format :json 

    helpers Pundit 
    helpers do 
    def current_user 
     resource_owner 
    end 
    end 

    mount FoosAPI 
end 

Teraz w was API punktów końcowych, powinieneś być w stanie korzystać authorize foo, action? jak można zawsze zrobić w sterownikach Rails:

class FoosAPI < Grape::API 
    get ':id' do 
    foo = Foo.find(params[:id]) 
    authorize foo, :show? 
    present foo, with: FooEntity 
    end 
end 

Mam nadzieję, że pomoże!

+0

Hey bud dzięki, tylko jedna rzecz, druga param metody autoryzacji jest faktycznie symbolem 'autoryzacji: foo,: pokaż' Pierwszy param może być symbol, nazwa klasy lub instancją? klasa – juliangonzalez

+0

@JGonzalezD: Ładnie złapałem, naprawiłem. Dzięki! – fengye87