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

2024-05-24

您如何防止其他用户编辑对象,例如不属于自己的配置文件对象?

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

  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用户无法执行任何操作,访客用户可以查看个人资料:

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桌子。另外,如果您可能需要让猜测用户看到这样的个人资料:

class ProfileController < ApplicationController
    before_filter :authenticate_user!, :except => :show
    load_and_authorize_resource
end

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

祝你好运!


UPDATE: 为用户创建 :role 属性

我所做的是运行迁移,添加role列到设计users table:

rails generate migration add_role_to_users role:string

进而rake db:migrate。新的迁移文件应如下所示,并检查您的数据库/模式.rb文件以确保其在用户表中的部分正确。如果不是那么rake db:drop, then rake db:create进而rake db:migrate again.

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

  def self.down
    remove_column :users, :role
  end
end

这就是你成功制作的方法user.role work.

注意:请确保您离开该行:can :manage, Profile, :user_id => user.id保持原样,没有任何变化。添加后应该可以工作role列至user.

重要的!如果您使用 Rails 3,请执行以下操作NOT MAKE role attr_accessible或者每个人都可以编辑自己的角色! Rails 4 用途参数强 http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html默认情况下,不受此问题的影响,因为您可以选择允许的参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Devise + CanCan 只是阻止其他用户编辑对象 的相关文章

随机推荐

  • 通过ExternalProject_Add 使用 pybind11 进行 CMake 项目的智能方法

    我正在使用编写一个 python 模块pybind11 with CMake3 9 4 因为方便所以想下载pybind11源文件使用ExternalProject Add in my CMakeLists txt 当我跑步时cmake 它不
  • 立即调用 Swift UIView animateWithDuration 完成闭包

    我期望在指定的持续时间后调用此 UIView 动画的完成闭包 但它似乎立即触发 UIView animateWithDuration Double 0 2 animations self frame CGRectMake 0 self bo
  • 如何在elasticsearch索引中一起使用ngram和edge ngram tokenizer?

    我有一个包含 3 个文档的索引 firstname Anne lastname Borg firstname Leanne lastname Ray firstname Anne middlename M
  • 如何使用 jQuery 检测浏览器是否关闭

    我需要使用 jQuery 检测浏览器是否被关闭 如果是这样 则执行一个事件 我的网站上有一个聊天功能 很像 Facebook 可以让用户在导航到网站结构中的其他页面时保持登录状态 但如果他们单击 则需要将他们从聊天中注销 这样他们就不会在线
  • Java 相当于 Python 的 urllib.urlencode(基于 HashMap 的 UrlEncode)

    From https stackoverflow com questions 2018026 should i use urllib or urllib2 2018103 2018103 Java 中 Python 的 urllib url
  • 角度距离计算

    我正在使用角度制作距离计算应用程序 Html
  • 从文本文件更新 wiki 消息

    是否可以让我的 wiki 从 txt 文件加载一行文本并将其显示在主页上的某个位置 像 每日消息 这样直接来自 txt 文件并且不涉及手动编辑 wiki 的东西 我的wiki运行在Ubuntu Mate上 如下 UPDATE 根据亚历山大的
  • 在模块中使用shiny的renderUI

    这是我在 stackoverflow 上的第一个问题 我在闪亮 1 0 5 中遇到模块和 renderUI 的问题 当我在中使用 renderUI 时 Main Part ui lt bootstrapPage uiOutput Dynam
  • R 中的整数或双精度列表

    我有一个大约 1000 个整数的列表 我需要能够进行一些数学计算 但它们被困在列表或字符形式中 我怎样才能切换它们以便它们可用 样本数据 gt y 1 1 7 3 1 6 7 1 7 6 5 3 1 3 3 0 6 2 4 9 19 1 9
  • 用户的完整 UNIX 用户名

    想知道您是否知道是否有一种巧妙的方法可以从 shell 获取完整的用户名 示例 如果我的 UNIX 用户名是 froyo 那么我想获取我的全名 在本例中 如系统中注册的那样 froyo Abhishek Pratap Finger 命令可以
  • 如何以编程方式伪造 UIButton 的触摸事件?

    我正在编写一些单元测试 并且由于这个特定应用程序的性质 重要的是我要达到尽可能高的水平UI链尽可能 因此 我想做的是以编程方式触发按钮按下 就好像用户按下了按钮一样GUI 是的 是的 我could只需致电IBAction选择器 但同样 这个
  • 树的子节点/节点上的单击事件

    我真的对 ExtJs 树对象感到困惑 我的代码有问题 但我不知道是什么 考虑我有这个代码 var store Ext create Ext data TreeStore root expanded true children text de
  • 在Python中打开网站框架或图像

    所以我对 python 相当熟练 并且经常使用 urllib2 和 Cookies 来实现网站自动化 我刚刚偶然发现了 webbrowser 模块 它可以在默认浏览器中打开一个网址 我想知道是否可以从该 url 中仅选择一个对象并打开它 具
  • Javascript For 循环在 dom 元素上执行[重复]

    这个问题在这里已经有答案了 我有 javascript 代码来获取具有类名称的元素 并迭代从元素中删除该类 var elements document getElementsByClassName test console log Leng
  • 在线和离线管理 iPhone 应用程序

    我被困在一个点上 我也在离线管理我的应用程序 第一次我从网络服务获取所有配置文件数据并将其路径存储到 sqlite 中时 我在更新这些数据时遇到问题 例如如果图像发生更改 我应该如何通知我的应用程序 我在 Google 上搜索了它 唯一的解
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • DataGridView 行背景颜色没有改变

    我想根据加载时的特定条件更改 DGV 行的背景颜色 即使在 Windows 窗体中也是如此 但我看不到任何 DGV 行的颜色有任何变化 谁能告诉我如何解决这个问题 private void frmSecondaryPumps Load ob
  • CoreGraphics 在 iPhone4 上比在 3G/3GS 上慢

    我有一个用 CoreGraphics 绘制的图表 该图表可以水平滚动 并且当我们滚动它时就会绘制它 问题是 在 3G 3GS 上 滚动的速度和性能良好 但在 iPhone 4 上却比预期慢 我认为这是与 iPhone 4 的高分辨率有关的问
  • 使用循环(或向量化)按向量中的多个元素对列表进行子集化

    我有3个清单data frames my list lt list a data frame value c 1 5 class c letters 1 3 a b b data frame value c 6 1 class c lett
  • Devise + CanCan 只是阻止其他用户编辑对象

    您如何防止其他用户编辑对象 例如不属于自己的配置文件对象 大多数在线示例都是具有多个用户角色的复杂示例 我无法使其正常工作 但必须很简单 def initialize user can update Profile do profile p