2

別のユーザーとしてサインインしているときにアクセスしても、 AccessDeniedusers/1/editエラーは発生しません。その理由はわかりません。

  authorize_resource only: [:edit, :update]
  def edit
    @user = User.find(params[:id])
  end
  def update
    @user = User.find(params[:id])
    if @user.update_attributes(params[:user])
      redirect_to @user
    else
      render 'edit'
    end
  end

能力クラス:

class Ability
  include CanCan::Ability
  def initialize(user)
    user ||= User.new

    can :read, :all
    can :create, User
    can :create, Group

    can :update, User, id: user.id
  end
end

に変更authorize_resourceするとload_and_authorize_resource、期待どおりに動作します。しかし、これは関係ないはずですよね?

4

4 に答える 4

1

私はあなたと同じ問題に直面していますが、私にとっては、カンカンでデバイスを使用しています。したがって、私のコントローラーには、

 before_filter :authenticate_user!, :except=>[:create]

create以外のユーザーを認証します。

def index
    @user = User.all
    authorize! :index, @user
    respond_to do |format|
       format.html # index.html.erb
       format.xml  { render :xml => @user }
    end
end

ユーザーのアクセスを承認する各コントローラー関数は、このように実行できます。load_and_authorize_resourceを使用するだけでなく、承認する必要のある関数にすべてを配置することで、多くの作業を行う必要があるようですが、私が完了したものから少し助けてください。ここにリソースがあります:https://github.com/ryanb/cancan/wiki/authorizing-controller-actions。答えがあり、load_and_authorize_resourceが機能しない理由がわかった場合は、ここにも投稿してください:)

于 2012-10-12T15:01:42.793 に答える
1

@userあなたのコードは、ユーザーがオブジェクトではなく編集および更新アクションにアクセスすることを許可するだけです

このようにオブジェクトを手動で承認する必要があります

これを試して、

def edit
  @user = User.find(params[:id])
  authorize! :update, @user
end

def update
  @user = User.find(params[:id])
  authorize! :update, @user
  if @user.update_attributes(params[:user])
   redirect_to @user
  else
   render 'edit'
  end
end
于 2012-10-12T14:17:45.077 に答える
1

これが発生する理由については (まだ) 答えがありませんが、本質的に同じ問題に遭遇しました。私の状況は、各アクションを手動で承認するという点でのみ異なりました(「リソースの承認」または「load_and_authorize」に依存するのではなく、キーでした.

于 2013-01-24T07:56:05.463 に答える