Rails: Полезно ли ограничивать доступ к страницам в представлении? - PullRequest
0 голосов
/ 29 января 2012

Я создаю приложение, в котором люди могут создавать свои собственные страницы и получать к ним доступ по уникальному URL.Нет стандартного логина с адресом электронной почты и паролем или чем-либо подобным.Люди могут решить, хотят ли они установить пароль для своей страницы или нет.Если кто-то хочет просмотреть или отредактировать страницу, его должны попросить ввести пароль, если для этой страницы установлен пароль.Если нет, он сможет сразу же просмотреть или отредактировать страницу.Единственный способ, который мне пришёл в голову, чтобы достичь этого без тяжелого обходного пути, - это поставить управление доступом прямо в представление и изменить его вывод, если потом.

Теперь мне интересно, если этохорошая практика или если это может привести к серьезным проблемам уязвимости.

1 Ответ

1 голос
/ 29 января 2012

Краткий ответ: Нет. Вы не хотите максимально чистить представление от логики. Что еще более важно, лучше использовать спокойную настройку, а не складывать больше логики в один контроллер и / или модель. В данном случае речь идет об аутентификации пользователя. Обычно проверка того, что пользователь вошел в систему против действия, выполняется с помощью before_filter. Таким образом, вы можете использовать before_filter на контроллере. Используйте переданный метод, чтобы проверить, защищен объект или нет. Когда этот объект защищен, проверьте, аутентифицирован ли пользователь в настоящее время.

В фильтре before вы можете перенаправить на альтернативное действие, предпочтительно настроенное для использования формы пароля. Я бы, вероятно, создал отдельный контроллер для этого. Можете называть это сеансами или аутентификацией, если хотите. Установите новое действие для формы пароля и настройте действие создания. Новое представление должно содержать page_id в каком-то скрытом поле, или вы можете сохранить его в маршруте, используя вложенные ресурсы. Например:

resources :pages do
  resource :session, :only => [:new, :create]
end

Это создаст маршруты вроде:

/pages/1/session/new
/pages/1/session (POST)

В вашем действии создания вы можете настроить что-то вроде хранилища сеансов (при условии, что пароль правильный). А в проверке подлинности просто проверьте значение этого хранилища сеансов.

...