Я использую authlogic, и он работает очень хорошо. Одна вещь, которую я заметил, это то, что как хакер я мог легко ввести этот адрес:

Localhost::3000/users/a_user_that_is_not_me/edit

Поскольку форма в форме редактирования предназначена для @user, для которого установлено значение current_user и требуется токен аутентификации, даже если я попытаюсь указать подробности для другого пользователя, я в конечном итоге изменю свою собственную учетную запись вместо других пользователей.

Это мило и хорошо, но я бы хотел, чтобы эти хакеры были перенаправлены еще до того, как увидят форму.

Я пробовал это в users_controller:

def edit
  if admin?
    @user = params[:user]
  elsif User.find_by_username(params[:id]) != current_user
    @user = current_user
    @not_user = User.find_by_username(params[:id])
    redirect_to user_path(@not_user)
  else
    @user = current_user
  end
end

Перенаправление работает, если я ввожу адрес с именем другого пользователя, но получаю ошибку 404 при попытке доступа к странице редактирования для текущего пользователя.

Есть идеи, почему это не работает?

1
Kenji Crosland 28 Янв 2010 в 01:04

2 ответа

Похоже, вы назначаете @user строке, если текущий пользователь является администратором. Это проще (менее подвержено опечаткам):

def edit
  u = User.find_by_username!(params[:id])
  if admin? or current_user.username == params[:id]
    @user = u
  else
    redirect_to user_path(u)
  end
end

Кроме того, не хотите ли вы использовать find_by_username! (с ударом в конце), чтобы отображалась страница 404, когда пользователь не найден? Я не уверен, как вы получаете страницу 404 сейчас...

1
Alex Reisner 28 Янв 2010 в 01:29
Я бы не ожидал, что это сработает, если не будет пользователя с именем «текущий». Если вы хотите, чтобы /users/current ссылался на текущего пользователя, вам придется явно обрабатывать этот случай (if params[:id] == 'current' ...). Вы также захотите добавить проверку в свою модель User, чтобы пользователь не мог выбрать имя «текущее».
 – 
Alex Reisner
28 Янв 2010 в 02:08
Казалось, это было установлено автоматически через authlogic gem. Я должен проверить это подтверждение.
 – 
Kenji Crosland
28 Янв 2010 в 02:20