Использование http_basic_authenticate_with на основе условной переменной и переменной экземпляра - PullRequest
0 голосов
/ 12 января 2019

Поэтому я пытаюсь защитить паролем одно представление в моем приложении 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

1 Ответ

0 голосов
/ 13 января 2019

Поскольку вы устанавливаете captable перед аутентификацией, вы можете использовать @captable в http_basic_authenticate_with. Также вам нужно создать отдельный приватный метод для проверки всех ваших условий:

before_action :authenticate_user!, unless: :able_to_see?, only: [:show]
http_basic_authenticate_with name: "secret", password: @captable.password, if: :able_to_see?, only: [:show]

def show
  # Note, @captable is already set in before_action.
  # IMHO, it's better to follow conventions and name the view `show`, 
  # in this case just leave the action empty
  render 'captables/private_captable_view'
end

private

def able_to_see?
  has_valid_access_token? && @captable.password.present?
end

что гость должен только ввести пароль, а не имя пользователя, но я не уверены, возможно ли это

К сожалению, это невозможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...