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
user646560 27 maj 2011, 18:24
Mam doświadczenie z CanCan, ale nie używałem authlogic. Co dokładnie robi UserSession.find?
 – 
Dogbert
27 maj 2011, 18:28
Sprawdza, czy jest obecna sesja użytkownika, polecił mi ją inny programista i działa z innymi funkcjami, takimi jak: can :read, User if UserSession.find, ale wydaje się, że dosent działa z indeksem.
 – 
user646560
27 maj 2011, 18:30
Czy mógłbyś wkleić kod akcji kontrolera i klasę Ability, gdzie to wszystko działa?
 – 
Dogbert
27 maj 2011, 19:26
Spróbuj zrobić authorize! :index, User.
 – 
Dogbert
27 maj 2011, 19:50
To zadziałało, dzięki! Powinieneś umieścić to jako odpowiedź, abym mógł na to zagłosować! Czy możesz również wyjaśnić, co się działo i dlaczego to nie zadziałało? Dzięki
 – 
user646560
27 maj 2011, 20:28

2 odpowiedzi

Najlepsza odpowiedź

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.

1
Dogbert 27 maj 2011, 20:40

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.

4
Preacher 27 maj 2011, 19:54
can [:show, :edit, :update, :destroy] można zastąpić :manage
 – 
Sergey Kishenin
27 maj 2011, 20:10
2
Właściwie nie, :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.
 – 
Brett Bender
27 maj 2011, 21:30