Я использую 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 при попытке доступа к странице редактирования для текущего пользователя.
Есть идеи, почему это не работает?
2 ответа
Если вы собираетесь делать подобные вещи часто, проверьте плагин авторизации, такой как authorization-san а>.
Авторизация отличается от аутентификации тем, что аутентификация представляет собой вход в систему, но авторизация относится к правам аутентифицированного (или неаутентифицированного) пользователя на выполнение действий.
С помощью authentication-san вы можете определить это правило с помощью этого фрагмента кода в вашем контроллере:
# this assumes you've got some way to set @user to the user you're looking up,
# e.g. in a before_filter
allow_access(:authenticated, :only => [:edit, :update]) { current_user == @user }
Похоже, вы назначаете @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 сейчас...
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.
/users/current
ссылался на текущего пользователя, вам придется явно обрабатывать этот случай (if params[:id] == 'current' ...
). Вы также захотите добавить проверку в свою модельUser
, чтобы пользователь не мог выбрать имя «текущее».