2011-11-03 56 views
3

我试图查看.pdf文件(使用PDFKit生成)未经身份验证,直接从给定网址host/.../profile.pdf直接进入时出现问题。我,果然,要求我输入凭据,如下图所示(而不是在用户/ sign_in路径):直接访问未经身份验证的pdf文件时设计身份验证

我输入正确的凭据,箱体上下波动,并要求再次证明。它可能看起来像用户或密码是错误的,但它们不是。来自控制器的相关代码如下:

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])并为自己写一个自定义筛选器以将未经身份验证的用户重定向到new_session_path,但这样做我不知道如何在注册后将用户重定向到pdf显示。

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

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

谢谢!

+0

为什么一个框弹出? 'before_filter:authenticate_user!'应该将你重定向到登录页面,不是吗?你有什么改变吗? – Robin

+0

您需要显示验证用户身份的代码。 – deviousdodo

+0

@Robin,nope,没有什么变化 – scumah

回答

10

首先,确保它实际上是为PDF提供服务的Rails,而不是它前面的Web服务器。 (根据你的配置,这可能是请求从来没有得到Rails首先。)

假设它是Rails服务文件,那么你应该检查你的devise.rb配置文件。您可能需要做:PDF导航格式,这将使设计发出302重定向到你的页面sign_in:

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

此外,您可能需要将PDF添加到您的mime_types.rb初始化,如果它不已经有:

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

+0

谢谢克里斯! Rails实际上正在服务(或试图)PDF,并添加pdf来设计navigational_formats作品!有意思的是:D(我需要3个小时才能奖励赏金) – scumah

+1

谢谢!这解决了我的问题!但是,现在设计将我重定向到/users/sign_in.pdf。有什么办法可以从sign_in路径中删除.pdf? – sung

+1

那么,我发现了一个解决我自己的问题:覆盖skip_format?方法在custom_failure.rb(<=更多关于此搜索stackoverflow)。方法体看起来像这样:$ w(html pdf */*)。include? request_format.to_s – sung

1

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

更新你的色器件配置(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