Devise + CanCan只是阻止其他用户编辑对象

Rub*_*tic 4 ruby-on-rails devise cancan ruby-on-rails-3

你如何阻止其他用户编辑一个对象,比如一个不属于他们自己的个人资料对象呢?

大多数在线示例都是具有多个用户角色的复合体,我无法使其工作,但必须简单:

  def initialize(user)

      can :update, Profile do |profile|
        profile.try(:user) == current_user
      end

  end
Run Code Online (Sandbox Code Playgroud)

在我的ProfilesController#edit中

authorize! :update, @profile
Run Code Online (Sandbox Code Playgroud)

Lea*_*RoR 12

第一个问题是,你有没有为自己的角色做过User

应用程序/模型/ user.rb

class User < ActiveRecord::Base
  attr_accessible :email, :password, :remember_me
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, # regular devise stuff
  before_create :setup_default_role_for_new_users

  ROLES = %w[admin default banned]

  private

  def setup_default_role_for_new_users
    if self.role.blank?
      self.role = "default"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我在这里有3个不同的角色,当创建新用户时,他们始终是default用户.现在有了CanCan设置,让我们说你想要admin能够做所有事情,default用户可以用他们自己的配置文件做所有事情,banned用户无法做任何事情,访客用户能够看到配置文件:

class Ability
  include CanCan::Ability
  # Remember that CanCan is for a resource, meaning it must have a class(model).

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    if user.role == "admin"
      can :manage, :all
    elsif user.role == "default"
      can :manage, Profile, :user_id => user.id
    elsif user.role == "banned"
      cannot :manage, :all
    else
      can :read, Profile # guest user
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这就是你如何让用户只编辑他们自己的个人资料和没人.


其他一些方便的注意事项:确保表格中有一user_idProfile.此外,如果您可能需要让猜测用户看到如下配置文件:

class ProfileController < ApplicationController
    before_filter :authenticate_user!, :except => :show
    load_and_authorize_resource
end
Run Code Online (Sandbox Code Playgroud)

他们将无法使用任何其他操作,CanCan仍会检查除其他所有内容之外的身份验证show.

祝好运!


更新:制作:用户的角色属性

我所做的是运行一个迁移,将role列添加到Devise users表中:

rails generate migration add_role_to_users role:string
Run Code Online (Sandbox Code Playgroud)

然后rake db:migrate.新的迁移文件应如下所示,并检查您的db/schema.rb文件,以确保正确区分其用户表.如果不是那么rake db:drop,rake db:create那么rake db:migrate又一次.

class AddRoleToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :role, :string
  end

  def self.down
    remove_column :users, :role
  end
end
Run Code Online (Sandbox Code Playgroud)

这就是您成功完成user.role工作的方式.

注意:确保您保留该行:can :manage, Profile, :user_id => user.id没有任何更改.添加role列后应该可以正常工作user.

重要!如果您使用的Rails 3,DO NOT MAKE role attr_accessible或每个人都可以编辑自己的角色!Rails 4 默认使用强参数,不受此问题的影响,因为您可以选择允许的参数.