co wiem CanCan i declarative_authorization, a ja realizowane zezwoleń oparte na rolach zarówno polecam kankana. Tylko moje dwa centy.
Przykład (niesprawdzone, niestety nie mogę przetestować tutaj i nie mam dostępu do mojego kodu)
Więc powiedzmy, że mamy strukturę takiego:
class User < ActiveRecord::Base
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :users
# attributes: project_read, project_create, project_update
end
Następnie CanCan może wyglądać tak:
class Ability
include CanCan::Ability
def initialize(user)
@user = user
@role = user.role
# user can see a project if he has project_read => true in his role
can :read, Project if role.project_read?
# same, but with create
can :create, Project if role.project_create?
# can do everything with projects if he is an admin
can :manage, Project if user.admin?
end
end
Możesz znaleźć wszystkie potrzebne informacje w wiki CanCan na github. Osobiste zalecenie, aby przeczytać:
Zasadniczo wystarczy przedłużyć powyższy przykład zawierać swoje role poprzez swoje relacje. Aby to było proste, możesz także utworzyć dodatkowe metody pomocnicze w ability.rb
.
Głównym średnią zastrzeżenie może spaść do (przynajmniej ja): Upewnij się, że użytkownik może coś zrobić z modelem przed określić co użytkownik nie może. W przeciwnym razie będziesz siedział sfrustrowany i myślisz "ale dlaczego? Nigdy nie napisałem, że użytkownik nie może". Tak. Ale nigdy też wyraźnie napisał, że może ...
W CanCan można definiować umiejętności za pomocą bloków z warunkami - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks. –
1. TeamMembers ma wielu użytkowników, role 2. Zespoły mają wielu TeamMembers 3. Projekt ma jeden zespół ... W przypadku bloków powyższa konfiguracja nie zapewnia możliwości filtrowania dla konkretnej instancji projektu. Jeśli sądzisz, że da się to zrobić ... Czy mógłbyś podać mi np. Z góry dziękuję. –