0

管理者ユーザーに、自分が作成したユーザーの表示と編集のみを許可することに問題があります。階層化されたシステムを使用しています: SuperUser > Admin > other users 私の SuperUser はすべてのユーザーを編集できますが、私の Admin ユーザーは自分自身しか編集できません。これを修正するために、現在のユーザーの ID と一致する Creator_id を新しいユーザーに与える Creator_id パラメータがあります。

ユーザー用の私のコントローラー:

class UsersController < ApplicationController
  #CanCan resource will generate a 500 error if unauthorized
  load_and_authorize_resource :user
  # GET /users
  # GET /users.json
  def index
    @users = User.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  end

  # GET /users/1
  # GET /users/1.json
  def show
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/new
  # GET /users/new.json
  def new
    @user = User.new

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @user }
    end
  end

  # GET /users/1/edit
  def edit
    @user = User.find(params[:id])
    #User.find(session[:user])
  end

  # POST /users
  # POST /users.json
  def create
    @user = User.new(params[:user])
    @user.creator = current_user

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'Registration successful.' }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /users/1
  # PUT /users/1.json
  def update
    @user = User.find(params[:id])
    #@user = current_user

    respond_to do |format|
      if @user.update_attributes(params[:user])
        format.html { redirect_to @user, notice: 'Successfully updated profile.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /users/1
  # DELETE /users/1.json
  def destroy
    @user = User.find(params[:id])
    @user.destroy

    respond_to do |format|
      format.html { redirect_to users_url }
      format.json { head :no_content }
    end
  end
end

そして私のability.rbファイル:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new  #Guest user w/o account

    #Permissions on what pages can be seen by which users, and what
    #Users can do with those pages
    if user.status == "Super User" 
      can :manage, :all
    elsif user.status == "Admin"
      can :manage, Book             
      can [:create,:new], User      
      can [:show, :update], User, :id => user.id 
      can :manage, User, :creator_id => user.id
    end
  end
end

データベースを確認したところ、現在のユーザーのIDが新しいユーザーのcreator_idに正しく割り当てられています。私は立ち往生しています。Cancan は、これらのユーザーを更新する許可を拒否し続けていますが、その理由はわかりません。どんな助けでも大歓迎です!

編集

私のユーザーモデル:

class User < ActiveRecord::Base
  has_many :books
  has_many :listings
  has_many :orders
  belongs_to :organizations
  belongs_to :creator, class_name: 'User'
  attr_accessible :password, :email, :first_name, :last_name, :password_confirmation,   :status, :username
  acts_as_authentic
  validates :first_name, :presence => true
  validates :last_name, :presence => true
  validates :username, :presence => true, :uniqueness => true
  validates :email, :presence => true, :uniqueness => true
  validates :status, :presence => true
end
4

2 に答える 2

0

あなたの質問をもう一度読むと、管理者にユーザーを管理するための権限のあるアクセス権が必要なようです。この場合、あなたのapplication_controller

def correct_user
    if !params[:id].nil?
      @user.User.find_by_id(params[:id])
      if current_user.status :admin
        else
        access_denied unless current_user?(@user)
      end
    end
  end

これにより、管理者はすべてのユーザー アカウントにアクセスできるようになり、ユーザーが管理者でない場合はアクセスが拒否されます。コントローラーでを使用してこの機能を有効にすると、このbefore_filterようなことを行うことができbefore_filter :correct_user, :only => [:edit, :show]、正しいユーザーのみがこれらのアクションにアクセスできるようになります。UserControllerしたがって、おそらく次のようなものが必要です。

class UsersController < ApplicationController
  load_and_authorize_resource
  before_filter :correct_user, :only => [:edit, :show]
  ..
  ....
   .....
end 

この例は、正しいユーザーまたは管理者として編集および表示アクションへのアクセス権があることを示しています。

于 2013-05-31T17:02:22.380 に答える
0
Try this.

def initialize(user)
  user ||= User.new

  if user.super_user?
    can :manage, :all
  elsif user.admin?
    can [:create, :new], User
    can [:show, :edit, :update], User do |usr|
      id == usr.id
    end
    can :manage, User do |usr|
      usr.creator_id == usr.id
    end
  end
end

In user model, add methods:

def has_status?(given_status)
  status == given_status
end

def admin?
  has_status? 'Admin'
end

def super_user?
  has_status? 'Super User'
end
于 2013-07-15T16:43:43.267 に答える