Autoryzacja raz jeszcze

Podczas mojej pracy z railsami stosowałem już kilka pluginów do autoryzacji, ale szczerze mówiąc nie znalazłem jeszcze takiego, który by mnie do końca przekonał. Ostatnio używałem base auth i jest to świetny plugin, głównie dlatego, że jest prosty jak w mordę strzelił i można w modelach zaimplementować co tylko się chce jeżeli chodzi o autoryzację.

Ostatnio podejście base auth przysporzyło mi jednak sporo pracy. Jak łatwo można zauważyć, żeby pozwolić, albo zabronić userowi na korzystanie z np. akcji w kontrolerze, musimy w tym kontrolerze ustawić kto może z niego korzystać. Wszystko jest ok dopóki nagle nie trzeba dodać innej roli. Na przykład w założeniach miał być tylko admin i user, a nagle okazuje się, że potrzebne jest jeszcze konto dla moderatora, który ma większe uprawnienia niż zwykły user, ale mniejsze niż admin. I teraz trzeba sobie przejrzeć wszystkie kontrolery (w tym wypadku ze 40) i pozmieniać co trzeba (i jeszcze trochę miejsc w widokach, i trochę w samych akcjach w kontrolerach). Nic przyjemnego.

Dlatego zacząłem myśleć nad alternatywą, ale to co oferuje wiele pluginów, czyli trzymanie uprawnień w bazie danych to dla mnie zbędny narzut wydajnościowy, o ile nie ma realnej potrzeby stworzenia interfejsu do zmiany uprawnień (a z reguły nie ma, nawet jak klient na to nalegał, to później okazywało się, że ustawiałem prawa dostępu i tak czy siak nikt tego nie ruszał oprócz mnie).

Po tych doświadczeniach skrystalizowały się moje potrzeby: plugin, który umożliwia zdefiniowanie miejsc, do których potrzebuję praw dostępu, a później w jakimś pliczku zdefiniowanie, które role mają dostęp do których miejsc.

Na przykład:

[code]# jakiś widok
<% allow?(:change_something) do %>

<% end %>

i później zdeklarowanie w jakimś oddzielnym pliku ról:

role :admin do
allow :change_something
end[/code]
Oczywiście to bardzo prosty przykład, ale fajnie by było mieć jakieś bardziej zaawansowane możliwości.

Przeglądając pluginy do autoryzacji na ruby-toolbox najbardziej podpasował mi declarative authorization. Problem w tym, że według mnie ten plugin idzie trochę za daleko, tzn. jest dużo bardziej skomplikowany niż mógłby być. Z jednej strony to dobrze, bo można mieć z poziomu jednego API dostęp do deklarowania praw dostępu na poziomie modelu, ale z drugiej strony nie wiem czy chcę, żeby tak to się odbywało.

Jakie macie doświadczenia z takim podejściem do autoryzacji? Używał ktoś może declarative_authorization, jeżeli tak, to jak wrażenia?

A może byś po prostu dorzucił ten ficzer do base_auth, przykrył testami i posłał pull requesta? :slight_smile:

Chętnie, ale jak mi rozszerzysz nieco dobę :wink: Tak do 30 godzin może? :stuck_out_tongue: