Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,如何验证用户有权修改条目?_Ruby On Rails_Ruby_Devise_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails 在Rails中,如何验证用户有权修改条目?

Ruby on rails 在Rails中,如何验证用户有权修改条目?,ruby-on-rails,ruby,devise,ruby-on-rails-3.2,Ruby On Rails,Ruby,Devise,Ruby On Rails 3.2,在我的rails应用程序中,我使用Desive对应用程序中的用户进行身份验证。它给我一些变量,比如current_user.id,它是当前登录用户的UserID 在我的应用程序中,每个用户都是至少一个组的成员。任何用户都可以创建一个或多个小饰品,并可以将每个小饰品分配给他们的一个组 因此,以下是我的模型: User has_many :memberships User has_many :groups, :through => :memberships Group has_many :m

在我的rails应用程序中,我使用Desive对应用程序中的用户进行身份验证。它给我一些变量,比如
current_user.id
,它是当前登录用户的UserID

在我的应用程序中,每个用户都是至少一个组的成员。任何用户都可以创建一个或多个小饰品,并可以将每个小饰品分配给他们的一个组

因此,以下是我的模型:

User has_many :memberships
User has_many :groups, :through => :memberships

Group has_many :memberships
Group has_many :users, :through => :memberships
Group has_many :trinkets

Trinket belongs_to :group
这就是我的模特!一切都很好

当用户更新一个小饰品时,他们可以将该小饰品分配给他们的一个组

但是,有一个安全漏洞!如果有人查看韦小宝/编辑或韦小宝/新建页面,复制HTML源代码,更改表单中
标记的值,他们实际上可以将他们的韦小宝提交到其他人的GroupID中

我希望在模型或控制器中添加验证,以便在将提交的值写入数据库之前确认用户确实有权使用这些值。在本例中,我想查看此小饰品的GroupID是否为
User.find(current_User.id).groups
中的GroupID,但我不知道如何在小饰品模型中进行验证

有人知道如何验证用户是否正在尝试为实际有权分配值的对象分配值吗?Desive或其他gem是否有检查用户提交数据关联的方法

当前的小饰品模型文件只有:

attr_accessible :trinketname, :group_id
validates_presence_of :trinketname
希望这是有意义的。感谢您的帮助!:-)


版本:Rails 3.2.13、Ruby 1.9.3p392、Desive 2.2.4。我的应用程序\u controller.rb文件中确实有
防止\u伪造

您可以在操作中添加
if
语句。这可能不准确,但我希望它能说明问题:

 def create
   if trinket.group_id == current_user.group_id
     trinket.new(params[:trinket])
       if trinket.save
         redirect_to somewhere
       else 
         render :new
       end
   else      
    flash[:warn] "You're not allowed"
 end

你需要的是授权

考虑使用多种可用授权框架中的一种来实现您的目标

由瑞安·贝茨创作的这本书是最受广泛考验的作品之一

更新:可以执行以下操作:


这不会将用户和管理员这样的角色分开吗。许多用户可以扮演用户的角色,他们可以不受限制地访问它。是和否。虽然它可以帮助您区分不同类型的用户,但例如,CanCan
功能也可以让您更好地控制
用户的权限。看看上面的更新。酷。那肯定也行。虽然如果您不需要角色,只想拥有一个简单的授权。我会用一个helper方法,把它放在你喜欢的地方。这是一个巨大的帮助,让我朝着正确的方向前进。然而,我并没有使用组来定义用户拥有什么权限,而是使用组,比如用于小饰品的存储桶。当有人去创建一个新的饰品时,上面的CanCan能力会给予拒绝许可,因为该饰品尚未分配给一个组。组分配在创建/更新饰品时完成。我认为对我来说最好的选择是在小饰品控制器中添加一些逻辑,仅当group_id属性在User.find(current_User.id).groups.Btw列表中时才允许保存。顺便说一句,我只是使用CanCan gem来设置小饰品本身的授权。CanCan现在检查当前用户是否是该饰品所在组的成员,然后允许他们管理该饰品。感谢您的建议,您可以在控制器的“创建和更新”操作中添加检查。类似于如果Tricket.group\u id==current\u user.group\u id,然后执行创建操作else flash[:warn]“你不被允许”谢谢你,iRichLau。真管用!因为我的用户组关系是多对多的,所以我必须进行数组查找,而不是直接的
=
匹配。对于
def-create
if-current\u-user.groups.include?(Group.find@weinket.Group\u-id)
,对于
def-update
if-current\u-user.groups.include?(Group.find参数[:weinket][:Group\u-id])
。如果提交的数据包含用户不是其成员的组id,则返回false。如果提交的组id在数据库中不存在,它会抛出一个ActiveRecord::RecordNotFound,这是无意的,但可以接受,因为这也是一个有效错误。耶!
class Ability
  include CanCan::Ability

  def initialize(user)
    can :manage, Trinket, group: { id: user.group_ids }
  end
end