Rails: Как создать 404 или перенаправить на нежелательную эксплуатацию URL? - PullRequest
2 голосов
/ 14 апреля 2010

Я хочу скрыть URL для редактирования пользователей и их профилей за более безопасными и значимыми URL.Например, я хочу, чтобы /user/13/edit было /settings/account и /user/13/profile/edit было /settings/profile.

Мне удалось этого добиться, но для этого мне пришлось загружать информацию пользователя из бита current_user из сеанса.Вот так:

# users_controller
def edit
  @user = current_user
end

# profiles_controller
def edit
  @user = current_user
  @profile = @user.profile
end

Но теперь, поскольку я не могу сравнить @user.id из params с current_user в сеансе, как я могу остановить старые URL-адреса (/user/13/edit и/user/13/profile/edit) от использования?Они всегда загружают формы для текущего пользователя, так что никакого вреда это не причинит, но мне было бы удобнее, если бы они просто выдавали ошибку 404 или что-то в этом роде.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Прежде всего, ваш механизм аутентификации должен установить текущего пользователя.

routes.rb

map.account '/settings/account', :controller => 'user', :action => 'edit' 
map.profile '/settings/profile', :controller => 'user', :action => 'edit_profile'

map.resources :users, :only => [:edit, :update, :show],
              :member => { :edit_profile => :get, :update_profile, :put }

производит следующие маршруты:

/settings/account         (get)
/settings/profile         (get)
/users/:id                (get, put)
/users/:id/edit           (get)
/users/:id/edit_profile   (get)
/users/:id/update_profile (put)

users_controller.rb

before_filter :redirect_if_unauthorized

def edit
  @user = current_user
end

# profiles_controller
def edit
  @user = current_user
  @profile = @user.profile
end

protected

def redirect_if_unauthorized
  redirect_to some_path if params[:id] or current_user.nil?
end

Очевидно, что some_path не существует, вам придется создать страницу / путь и т. Д. Для отображения ошибки.

С этим решением вы никогда не будете отображать / манипулировать пользователем на основе параметров [: id], только текущий_пользователь, сохраненный вашей схемой аутентификации.


Я также мог бы предложить посмотреть на гем / плагин Declarative_authorization ( Github , Railscast )

0 голосов
/ 14 апреля 2010

URL / edit все еще существуют, потому что я держу пари, что у вас есть map.resources в вашем файле rout.rb для пользовательской модели. Вы можете поместить строку выше, чем в вашем файле rout.rb, которая явно соответствует линиям редактирования, которые вы хотите перенаправить, и указывать их в любом месте.

...