Używam authlogic i cancan w aplikacji rails 3, chcę zezwolić wszystkim zalogowanym użytkownikom na dostęp do strony users index
, próbowałem czegoś takiego, ale wydaje się, że to działa:
Klasa umiejętności:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
can :index, User if UserSession.find
can :read, User if UserSession.find
end
Kontroler:
def index
@users = User.search(params[:search]).order('username').page(params[:page]).per(1)
authorize! :index, @users
end
def show
@user = User.find(params[:id])
authorize! :read, @user
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @user }
end
end
Dzięki
2 odpowiedzi
Kontynuując mój komentarz, problem był w następującym kodzie
authorize! :index, @users
Tutaj przekazujesz tablicę użytkowników do metody CanCan, podczas gdy twoja deklaracja can :index, User
definiuje autoryzację dla obiektu użytkownika.
Uważam, że łatwiej jest używać load_and_authorize_resource
na górze moich kontrolerów. Wtedy twoja klasa umiejętności zawiera całą logikę zdolności, zamiast rozrzucać ją na kontrolerach.
Umiejętność.RB.
class Ability
include CanCan::Ability
def initialize(user)
if user
can :index, User
can [:show, :edit, :update, :destroy], User, :id => user.id
end
end
end
Users_controller.rb
class UsersController < ApplicationController
load_and_authorize_resource
def index
@users = User.search(params[:search]).order('username').page(params[:page]).per(1)
end
def show
end
...
end
Od jakiegoś czasu nie używałem authlogic, ponieważ teraz używam devise, więc nie jestem pewien, czy mój przykładowy kod jest gotowy na authlogic. Jeśli nie chcesz używać load_and_authorize_resource
, mój kod pokazuje, jak ograniczyć to, co użytkownicy mogą zobaczyć w klasie umiejętności, ale w twoim kodzie zmieniłbym :read
na :show
.
can [:show, :edit, :update, :destroy]
można zastąpić :manage
:manage
oznacza, że użytkownik może wykonać dowolną akcję (w tym akcje zdefiniowane przez użytkownika) na danym obiekcie. Więc jeśli dla Użytkowników masz akcję vote
, :manage
pozwoli użytkownikom głosować, podczas gdy [:show, :edit, :update, :destroy]
nie.
Podobne pytania
Nowe pytania
ruby-on-rails
Ruby on Rails to framework aplikacji internetowych typu open source z pełnym stosem, napisany w języku Ruby. Opiera się na popularnym modelu frameworkowym MVC i jest znany ze swojego podejścia do tworzenia aplikacji „konwencja zamiast konfiguracji”.
UserSession.find
?can :read, User if UserSession.find
, ale wydaje się, że dosent działa z indeksem.authorize! :index, User
.