1

承認にCanCanを使用し、認証にDeviseを使用します。私には3つの役割があります。管理者ロールはすべてのアクションにアクセスできます。ただし、管理者としてログインしている場合でも、アクセスが拒否されます。私は何が間違っているのですか?また、私は実装のためにこのウィキをフォローしています

これは私のコントローラーコードです

class LocationController < ApplicationController
  #before_filter :authenticate, :only => [:title_clearing]
  before_filter :authenticate_user!
  load_and_authorize_resource

  def show
    @data = []
    if params[:Date].match(/^(19|20)\d\d[- \/.](0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])$/).nil? == true
      @message = "Wrong Date Format"
    else
      @data = Location.show(params[:Date])
      if @data.size == 0
        @message = "No data exists for "+ params[:Date]
      else
        @message = "Data loaded successfully for "+ params[:Date]
      end
    end

    if params[:Date] == "all"
      @message = "All records loaded"
      @data = Location.show("all")
    end

  end
end

ability.rbで

if user.is? :admin
    can :all, :location 
end
if user.is? :titleclearing
    can :title_clearing, :location
end
if user.is? :acquisitions
    cannot :title_clearing, :location 
end

ユーザーモデルでは

def role?(role)
    roles.include? role.to_s
end
4

3 に答える 3

1

ユーザー固有のCanCan規則:

if user.is? :admin
  can :manage, Location
end

または、すべてを管理できます。

can :manage, :all
于 2012-11-11T20:28:06.157 に答える
1

多分これは能力の優先順位のためです。のあなたの定義でability.rb、私は思う:

  • ユーザーは役割をacquisitions継承しているユーザーの能力は役割titleclearingとを持っていadminます。
  • そして、ユーザーは役割をtitleclearing継承し、ユーザーの能力は役割を持っていますadmin

つまり、あなたが言ったように"now everyone's being let through"、すべてのユーザーがの能力を持っているからadminです。次のように能力の順序を変更してみてください。

if user.is? :titleclearing
  can :title_clearing, :location
end
if user.is? :acquisitions
  cannot :title_clearing, :location 
end
if user.is? :admin
  can :all, :location 
end

希望どおりに機能するかどうかを確認します。

于 2012-11-12T04:55:05.943 に答える
0

これを試して:

if user.is? :admin
  can :manage, :location
end

ウィキから

:manageを渡して任意のアクションを表し、:allを渡して任意のオブジェクトを表すことができます。

于 2012-11-11T20:24:56.667 に答える