Разработать и текущий пользователь - PullRequest
3 голосов
/ 27 апреля 2011

Я настроил Devise для управления аутентификацией в моем приложении.

У меня есть модель категории, в которой пользователи создают свои собственные категории. Пользователь has_many: категории. Эта модель имеет атрибут user_id, поэтому, когда кто-то входит в систему и переходит, например, к категориям / индексу, из контроллера запрос выводит категории, используя current_user.id, чтобы отфильтровать, какие из них выводить.

Пока что все прямо и работает хорошо, кажется, что никто не может видеть чьи-то категории, но, честно говоря, если я что-то упустил, это кажется немного небезопасным. Откуда я знаю, что какой-то хакер не поймет это и не отправит свои запросы на изменение параметров?

Это возможно или я параноик? Кроме того, возможно, я не правильно использую эту функцию?

Ответы [ 3 ]

2 голосов
/ 27 апреля 2011

При условии, что вы используете правильные отношения между users и categories, т.е.

# in User.rb
has_many :categories

# in Category.rb
belongs_to :user

вы должны иметь возможность использовать что-то вроде этого в вашем контроллере:

@categories = current_user.categories

Таким образом, вы используете текущего пользователя независимо от того, какие параметры могут быть переданы, и он получит только свои галереи. Вы больше не ищете потенциально небезопасный user_id.

Если вы беспокоитесь о том, что кто-то может просматривать не принадлежащую им категорию, вы можете добавить свой собственный закрытый метод, аналогичный :authenticate_user!, чтобы убедиться, что отображаемая или измененная категория действительно принадлежит текущему пользователю запустить его в before_filter, как и другой, и перенаправить, если у них нет разрешения.

  private
  def authenticate_owner!
    if user_signed_in? && current_user.id == params[:id] # or something similar
      return true
    end
    redirect_to root_url,
      :notice => "You must have permission to access this category."
    return false
  end
1 голос
/ 09 февраля 2012

Я думаю, что у вас есть настройка отношений один-к-одному (одна категория на пользователя) вместо одного-ко-многим (много категорий на пользователя). Если у вас есть category_id в модели User, ваша установка должна быть следующей:

# in User.rb
belongs_to :category

# in Category.rb
has_many :users

# in CategoriesController
@category = current_user.category

Если вы хотите иметь несколько категорий на пользователя, то я предлагаю использовать таблицу ссылок (как модель UserCategory) с user_id и category_id.

# in UserCategory.rb
belongs_to :user
belongs_to :category

# in User.rb
has_many :user_categories
has_many :categories, :through => :user_categories

# in Category.rb
has_many :user_categories
has_many :users, :through => :user_categories

Затем в вашем контроллере Category вы можете использовать свой код сверху, чтобы захватить все категории данным пользователем.

# in CategoriesController.rb
@categories = current_user.categories
0 голосов
/ 10 ноября 2013

Основываясь на ответе Джоша, я просто сделал это в выражении if else. Я преобразовал params[:id] в целое число, поскольку current_user.id возвращает единицу.

class UsersController < ApplicationController
  before_filter :authenticate_owner!
  #....
  private
  def authenticate_owner!
    if user_signed_in? && current_user.id == params[:id].to_i
      return
    else
      redirect_to root_url, :notice => "You must have permission to access this page."
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...