0

如何防止任何人提交表单?现在,任何用户都可以在任何其他用户的个人资料上更新表单,而他们应该只能触摸自己的个人资料。

如果表单不在当前用户的个人资料中,我应该隐藏表单,还是在控制器内做一些更安全的事情?

例如,我有一个创建新书的表单。实际上,表单应该显示的唯一时间是在登录用户的个人资料页面上。该表格应隐藏在其他人的个人资料页面上。

形式:

<%= form_for @book do |f| %>
    <%= f.hidden_field :user_id, :value => @user.id %>
    <%= f.hidden_field :status, :value => "f" %>
    <%= f.text_field :title, :placeholder => "Title" %>
    <%= f.text_field :author, :placeholder => "Author" %>
    <%= f.submit 'Add Book', :value => "" %>
<% end %> 

编辑:

我开始使用 CanCan,但仍然无法限制在其他用户的个人资料上创建书籍的访问权限。

我的新技能.rb:

class Ability
    include CanCan::Ability

    def initialize(user)
        can :read, :all
        can :create, Book
    end
end

在应用程序控制器中过滤之前:

class ApplicationController < ActionController::Base
  before_filter :current_user

  def current_user
    User.current = current_user
  end
end
4

2 回答 2

2

隐藏表单,并将 user_id 作为字段删除。在控制器中,如果用户有很多/一本书,则利用该关联:

def create
   @book = current_user.books.new(params[:book])
   ...
end

如果由于某种原因表单被意外显示,当前用户将只能添加他们自己的书籍。

于 2012-12-31T02:30:34.480 回答
1

您正在寻找授权方案。控制器逻辑是重要的部分(实际上是允许或禁止该操作),但视图是用户看到的,因此您应该同时实现两者。

虽然您可以自己滚动,但CanCan是一种相对轻松的方式。

CanCan 使实现视图逻辑变得容易(您仍然必须这样做),如下所示:

<% if can? :create, Book %>
<%= render '/books/form'%>
<% end %>

gem 创建者 Ryan Bates 也是 RailsCasts 的创建者。方便的是,有一个涵盖 CanCan

对于您的用例,我会定义这样的能力:

can :create, Book do |book|
  book.user = User.current
end

您需要在应用程序控制器中添加一个 before_filter 以将当前用户放入User.current变量中以使其工作(访问模型中的当前用户)。并将这两种方法添加到您的User模型中:

  def self.current
    Thread.current[:user]
  end
  def self.current=(user)
    Thread.current[:user] = user
  end
于 2012-12-31T02:34:09.143 回答