Поэтому я пытаюсь защитить паролем одно представление в моем приложении Rails. Я понял, что могу использовать http_basic_authenticate_with
, который хорошо работает, однако я хотел бы добавить немного изощренности.
Примечание. Я уже использую Devise для аутентификации пользователей, но это для пользователя, который делится просмотром с внешним лицом, у которого не будет учетной записи.
Пользователь теперь может добавить в Captable простой пароль, который я хочу, чтобы другие внешние гости должны были ввести, чтобы просмотреть представление captables/private_captable_view
. Если пароль не установлен и у пользователя есть действительный access_token
, то пользователь может просмотреть captables/private_captable_view
в любом случае (это уже работает).
Я пытаюсь добиться того, чтобы http_basic_authenticate_with
запускался, только если:
has_valid_access_token?
возвращает истину (в настоящее время работает)
- Captable имеет установленный пароль (т.е.
@captable.password.empty?
)
- Я бы хотел иметь возможность установить необходимый пароль для метода http authenticate на
@captable.password?
- что гость должен только ввести пароль, а не имя пользователя, но я не уверен, возможно ли это.
- Если гость вводит правильный пароль, мы выводим
captables/private_captable_view
Вот снимок с моего контроллера.
class CaptablesController < ApplicationController
before_action :set_company, unless: -> { request.xhr? }
before_action :set_captable, only: [:show, :edit, :update, :destroy], unless: -> { request.xhr? }
before_action :authenticate_user!, unless: :has_valid_access_token?, only: [:show]
http_basic_authenticate_with name: "secret", password: "secret", if: :has_valid_access_token?, only: [:show]
def index
@captables = @company.captables
end
def show
@captable = Captable.find(params[:id])
if has_valid_access_token?
if !@captable.password.empty?
# TODO use a http basic authenticate here to verify the user enters the password matching @captable.password if so render the private view.
else
render 'captables/private_captable_view'
end
end
end