直接访问未经身份验证的pdf文件时设计身份验证

时间:2011-11-03 14:41:47

标签: ruby-on-rails devise

我在尝试查看.pdf文件(使用PDFKit生成)未经身份验证时遇到问题,只是直接从给定的网址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

你看不出任何幻想。我尝试从过滤器(before_filter :authenticate_user!, :except => [:show])中删除show动作,并自己编写一个自定义过滤器,将未经身份验证的用户重定向到new_session_path,但这样做我不知道如何在注册后将用户重定向到pdf show。

简而言之,设计在访问pdf节目时询问我的凭据并且不接受它们。如何让用户访问sign_in页面并在签名后重定向回到pdf?

我正在使用Rails 3.0.7,Ruby 1.8.7和Devise 1.1.5。

谢谢!

2 个答案:

答案 0 :(得分:10)

首先,确保它实际上是Rails服务于PDF而不是前面的Web服务器。 (根据您的配置,可能是请求永远不会到达Rails。)

假设Rails服务于该文件,那么您应该检查您的devise.rb配置文件。您可能需要制作:pdf一种导航格式,允许Devise向您的sign_in页面发出302重定向:

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

此外,您可能需要将PDF添加到mime_types.rb初始值设定项中,如果它尚未存在:

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

答案 1 :(得分:3)

添加到已接受的答案并重复完整性:

更新您的设备配置(def checkNull(item): if item != None: return item.text.rstrip() return " " ),将pdf包含为config/initializers/devise.rb

同时更新您的设备配置以使用自定义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