Разработать аутентификацию при непосредственном доступе к PDF-файлу - PullRequest
3 голосов
/ 03 ноября 2011

У меня проблема при попытке увидеть файл .pdf (созданный с помощью PDFKit) без проверки подлинности, просто идущий непосредственно с данного URL host/.../profile.pdf.Меня, как и следовало ожидать, просят ввести учетные данные, как показано на изображении (не в пути users / sign_in):

asking for authentication

Я ввожу правильные учетные данные, поле отображаетсявверх и вниз и снова просит учетные данные.Может показаться, что пользователь или пароль неверны, но это не так.Соответствующий код от контроллера находится здесь:

class Entrepreneur::ProfilesController < ApplicationController
  before_filter :authenticate_user!

  def show
    respond_to do |format|
      format.pdf do
        html = render_to_string(:layout => false , :action => "show.html.haml")
        kit = PDFKit.new(html)
        send_data(kit.to_pdf, :filename => "name.pdf", :type => 'application/pdf')
      end
    end
  end
end

Ничего особенного, как вы можете видеть.Я попытался удалить действие show из фильтра (before_filter :authenticate_user!, :except => [:show]) и написать собственный фильтр для перенаправления неаутентифицированных пользователей в new_session_path, но при этом я не знаю, как после регистрации перенаправить пользователя в pdf-шоу.

Короче говоря, devise запрашивает мои учетные данные при доступе к PDF-шоу и не принимает их.Как я могу получить пользователя на страницу sign_in и перенаправить обратно в pdf после подписания?

Я использую Rails 3.0.7, Ruby 1.8.7 и Devise 1.1.5.

Спасибо!

Ответы [ 2 ]

10 голосов
/ 20 декабря 2011

Во-первых, убедитесь, что на самом деле Rails обслуживает PDF, а не веб-сервер перед ним.(В зависимости от вашей конфигурации, в первую очередь это может быть запрос, который никогда не попадет в Rails.)

Если предположить, что файл обслуживает Rails, то вам следует проверить файл конфигурации devise.rb.Вам может потребоваться сделать: pdf навигационный формат, который позволит Devise выпустить редирект 302 на вашу страницу входа:

config.navigational_formats = [:html, :pdf] # you may have additional formats

Также вам может понадобиться добавить PDF к вашим mime_typesинициализатор .rb, если его там еще нет:

Mime::Type.register 'application/pdf', :pdf

3 голосов
/ 18 сентября 2015

Добавление к принятому ответу и повторение для полноты:

Обновите конфигурацию вашего устройства (config/initializers/devise.rb), добавив pdf как navigational_format.

Также обновите конфигурацию вашего устройства, чтобы использовать пользовательский failure_app.

require 'custom_failure'

Devise.setup do |config|
  # Navigate on pdf request types (i.e. .pdf)
  config.navigational_formats = ["*/*", :html, :pdf]

  config.warden do |manager|
    # Custom app to redirect to login page on unauthenticated pdf request types
    manager.failure_app = CustomFailure
  end
end

Пользовательское приложение сбоя (lib/custom_failure.rb)

class CustomFailure < Devise::FailureApp

  # Redirect pdf request types to the login page
  def skip_format?
    %w(html pdf */*).include? request_format.to_s
  end

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