Что бы вы ни придумали - в конечном итоге это станет безопасностью из-за неясности из-за этого простого требования:
Пользователь нажимает на ссылку, которую мы предоставляем на его домашней странице (как я могуубедиться, что одна эта ссылка доходит до проекта 12?)
Однако вы можете просто затруднить точный выбор правильного URL-адреса для проекта.
Моя мысльбыло бы дать каждому проекту уникальный 'токен' - если вы не вошли в систему как владелец проекта, то вы должны использовать токен для доступа к нему.
Например, в вашей модели проекта вы могли быимейте это:
class Project
before_create :set_public_token
protected
def set_public_token
# Randomizes a 20-digit long hex code
self.token = ActiveSupport::SecureRandom.hex(20)
end
end
Затем в шоу-действии вашего проекта вам понадобится это:
class ProjectsController < ApplicationController
def show
@project = Project.find(params[:id])
# Obviously you would changed signed_in? to whatever method
# you have that verifies someone is logged in
if !signed_in? || @project.owner_id != current_user.id
raise "Unauthorized Access" if @project.token != params[:token]
end
end
end
Тогда владелец проекта может поделиться публичной ссылкой своегопроект для людей, которые хотят иметь к нему доступ, который будет выглядеть примерно так:
www.example.com/projects/14?token=3jks83kasdkt84h6cd86
Опять же, любой с таким URL может получить доступ к проекту, и я не думаю, чтоВы сможете разумноИзбавьтесь от этого - но это делает его намного более сложным.
Это та же концепция, что и многие функции сброса пароля.Любой, у кого есть доступ к токену сброса пароля, может сбросить ваш пароль после того, как вы запросили пароль.Но, зная, какой токен использовать, у вас уйдут годы (сделайте токен длиннее, чтобы его было труднее переманивать).
Это то, как я бы с этим справился, и как я видел, как с этим справляются.прошлое (фотобакет, частные гистограммы на github и т. д.)