2011-11-03 40 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 
相關問題