gpt4 book ai didi

ruby-on-rails - Devise + CanCan 只是阻止其他用户编辑对象

转载 作者:行者123 更新时间:2023-12-04 21:53:59 24 4
gpt4 key购买 nike

您将如何阻止其他用户编辑一个对象,比如一个不属于他们自己的配置文件对象?

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

  def initialize(user)

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

end

在我的 ProfilesController#edit
authorize! :update, @profile

最佳答案

第一个问题是,您是否为 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

如您所见,我在这里有 3 个不同的角色,当创建新用户时,它们总是 default用户。现在有了 CanCan 设置,假设您想要 admin无所不能, default用户可以使用自己的配置文件做任何事情, banned用户不能做任何事情, guest 用户可以看到个人资料:
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

所以这就是你让用户只编辑他们自己的配置文件而不是其他人的方式。

其他一些方便的笔记:确保您有 user_id您的 Profile table 。此外,如果您可能需要让猜测用户看到这样的配置文件:
class ProfileController < ApplicationController
before_filter :authenticate_user!, :except => :show
load_and_authorize_resource
end

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

祝你好运!

更新: 为用户制作 :role 属性

我所做的是运行一个迁移,将添加 role列到设计 users table :
rails generate migration add_role_to_users role:string

然后 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

这就是您成功制作 user.role 的方法工作。

注意:确保您离开该行: can :manage, Profile, :user_id => user.id没有变化。添加 role 后它应该可以工作列到 user .

重要的!如果您使用 Rails 3,请执行 不是 制造 role attr_accessible或者每个人都可以编辑他们的角色! Rails 4 用途 Strong Parameters默认情况下,不受此问题的影响,因为您可以选择允许的参数。

关于ruby-on-rails - Devise + CanCan 只是阻止其他用户编辑对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com