Rails Security: перенаправить, если не current_user - PullRequest
1 голос
/ 28 января 2010

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

3000 :: локальный / пользователей / a_user_that_is_not_me / редактировать

Поскольку форма в форме редактирования предназначена для @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 ]

3 голосов
/ 28 января 2010

Если вы собираетесь много заниматься этим, воспользуйтесь плагином авторизации, например 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 }
1 голос
/ 28 января 2010

Похоже, что вы присваиваете @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 сейчас ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...