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?