2016-06-14 3 views
1

Rails имеет некоторые очень хорошие методы для авторизации на основе ролей, например, cancanКак реализовать на страницы авторизации в Rails

Но как вы можете предоставить разрешение на конкретные страницы, а не контроллеры/действия.

Например, возьмите приложение, содержащее модель квитанции или счета-фактуры. Пользователь может войти в систему и создать счет-фактуру. Затем Пользователь должен отправить своему клиенту URL-адрес этого счета. Клиент не должен иметь доступ к счетам других клиентов, особенно важно, поскольку Rails генерирует последовательные и легко угадываемые имена путей (например,/invoices/1,/invoices/2 и т. Д.).

В идеале, клиенту не нужно регистрироваться, чтобы просматривать эти страницы. Одним из решений может быть создание случайного пароля при создании счета и отправка его клиенту для разблокировки этой страницы.

Это звучит как проблема, которая должна быть разумно распространена, но после Googling я не нашел много информации об использовании (хотя я могу использовать неправильные условия поиска).

Так что я хотел бы знать:

  1. Это то, что я должен пытаться с Rails?
  2. Есть ли какие-либо драгоценные камни или примеры приложений, которые я мог бы изучить?
  3. Каковы потенциальные соображения/подводные камни этого подхода?
+0

Если клиенту необходимо войти в систему для просмотра своего счета-фактуры, вы можете создать собственный метод проверки, если 'invoice' доставляется' current_user' или нет. – Emu

ответ

0

Привет, если пользователь, которому вы хотите иметь доступ, был зарегистрирован в системе, это не было бы проблемой, поскольку вы могли бы создать запись разрешений.

Как всегда ваша проблема с предсказуемыми URLs может быть легко решена: FriendlyID (https://github.com/norman/friendly_id) или мой личный фаворит тщеславия постоянных ссылок (http://blog.teamtreehouse.com/creating-vanity-urls-in-rails)

0

В идеале клиент не нужно, чтобы зарегистрироваться для просмотра эти страницы. Одним из решений может быть создание случайного пароля при создании счета и отправка его клиенту для разблокировки этой страницы.

Поэтому любой, у кого есть информация, должен иметь к нему доступ. Одним из решений является обфускация url или использование UUID, поэтому не выдавайте /invoices/1, вместо этого давайте /invoices/8a20ae59-30d5-41b6-86d3-ac66e3b43e9d. URL-адрес неизвестен. Тем не менее, URL-адрес является единственной частью информации, которую нужно получить для доступа к содержимому.

Если вам нужна двухфакторная авторизация, то самым простым способом является использование HTTP basic auth, создание пароля из URL-адреса и вашей secret_base и отправка его пользователю отдельно. Поскольку он создан, вам не нужно его хранить, вы всегда можете проверить его, создав его снова.

+0

Спасибо @rewritten, это хорошая идея. Я дам, что это снято и отчитывается –

Смежные вопросы