Wybrane funkcjonalności aplikacji dostepe tylko dla wybranego użytkown

Witam
Oczywiście pierwsze co się nasuwa to if user.id == 123 :slight_smile: ale nie jest to zbyt ładny i wygodny sposób i może być sporo takich ifów gdy dojdzie więcej takich specjalnych funkcjonalności.
W jaki sposób rozwiązujecie coś takiego ? Jak w widoku i jak w kontrolerach

CanCan to zacny gem. https://github.com/ryanb/cancan

Ja używam do takich rzeczy cancan-a.
Autoryzacja jest definiowana w jednym miejscu więc da się w miarę to wszystko ogarnąć.

Taki na szybko przykład:
ability.rb
if user.id == 123
can :do_something, :on_resource
end

w widoku:
<% if can? :do_something, resource %>

<% end %>

Do bardziej zaawansowanych zastosowań: declarative authorization

Edit: czy cancan jednak?

[quote=sevos]Do bardziej zaawansowanych zastosowań: declarative authorization

Edit: czy cancan jednak?[/quote]
Przy mega skomplikowanej autoryzacji (rozne role, rozne firmy, rozni pracownicy itp) cancan daje rade. Do tego jest super flexible wiec kazdy sobie z nim zrobi co zechce

Votum separatum. CanCan robi się wyjątkowo upierdliwy kiedy trzeba mieć cokolwiek ponad wymienione w przykładach defaulty.

chciałbym mieć cześć abilities w osobnym pliku, można jakoś dynamicznie rozszerzyć metodę initialize ?

def initialize(user) ...? end
najlepiej jakoś za pomocą

def self.included(base) base.send :include, InstanceMethods base.send :extend, ClassMethods end
żeby w ability.rb mieć tylko includowanie jednego modułu. Coś takiego niestety nie działa

module ClassMethods def initialize(user) can :make_foo, [Project] do |project| project.fooable? end super(user) end end
Inne pytanie, jeśli np user has many tasks i chciałbym dla danej roli dołożyć w tasku dodatkową validacje ?

Dodatkowo próbowałem zrobić coś takiego, żeby nie ruszać modeli tylko rozszerzyć to w initializers

Ability.send :include, Customizations::Ability Project.send :include, Customizations::Project
I to działa ale tylko po pierszym requescie, pod odświeżeniu rzuca się że brak metody, która jest definiowana w Customizations::Ability

Votum separatum. CanCan robi się wyjątkowo upierdliwy kiedy trzeba mieć cokolwiek ponad wymienione w przykładach defaulty.[/quote]
Example ?

Kodu komercyjnych projektów nie wkleję, bo mi nie wolno.
Ale na wstępie: brak operacji logicznych na zbiorach abilities (gdzie jest mój DRY?), brak możliwości zdefiniowania tej samej ability dla kilku(nastu) modeli w jednej linijce (can :read, [Model1, Model2, Model3]).

Jak się nie da? :smiley:

[:Model1, :Model2, :Model3].each {|model| can :read, Kernel.const_get(model)}

Nie używałem CanCan więc może jestem głupio-mądry :stuck_out_tongue:

Brawo Jasiu, czuję się poprawiony. Not :wink:

To akurat da się zrobić, dokładnie jak w twoim przykładzie :slight_smile: z dokumentacji (https://github.com/ryanb/cancan/wiki/defining-abilities):
can [:update, :destroy], [Article, Comment]

OK, zatem czuję się poprawiony, a osobie która pisała ability.rb pełen osobnych linijek przekażę :wink:
Niemniej brak operacji na zbiorach abilities – możnaby zacząć od głupiego miksinu z jakimiś wspólnymi abilities – uważam za masakrę.

Czyli nie można wstrzyknąć tam jakiś swoich abilities ? Chciałbym je includować z innego modułu żeby nie śmiecić w tym pliku

@Tomash,brak operacji na zbiorach abilities - use case, user story, why?

  1. Kolejne poziomy autoryzacji.
  2. Rozłączne poziomy autoryzacji, w zależności od funkcjonalności / modułu, posiadające natomiast podzbiory wspólne mniejsze-lub-większe.

Serio, to tak dwa na już-teraz, a jest niedziela i jestem po butelce wina. Mam nadzieję że kolejne jesteś w stanie już sobie sam wymyślić :wink: