2016-06-14 18 views
8

Tôi đã thiết lập ứng dụng Rails 5 (5.0.0.rc1) với cờ --api. Nó đang sử dụng Warden để xác thực.Không có mã trạng thái trong Rails đăng nhập sau khi Warden auth failure

Tất cả đều hoạt động, ngoại trừ khi xác thực Warden không thành công, phản hồi không được ghi lại đúng cách. Nhật ký trông như thế này:

Started GET "/widgets.json" for ::1 at 2016-06-14 11:38:20 +0000 
Processing by WidgetsController#index as JSON 
Completed in 0ms (ActiveRecord: 0.0ms) 

hoặc, trong sản xuất:

I, [2016-06-14T14:12:54.938271 #17625] INFO -- : [db39f895-eeb1-4861-91d0-5d52c124e37a] Completed in 1ms (ActiveRecord: 0.0ms) 

Nó nên dĩ nhiên là nói Completed 401 Unauthorized in..., nhưng vì lý do gì, nó không biết mã trạng thái của phản ứng.

lỗi xác thực Warden đang được gửi đến một Rack tương thích, ActionController::Metal khiển -derived đó là rất đơn giản:

class UnauthorizedController < ActionController::Metal 
    include ActionController::Head 

    def self.call(env) 
    @respond ||= action(:respond) 
    @respond.call(env) 
    end 

    def respond 
    head :unauthorized 
    end 
end 

Đó là sử dụng các phương pháp cơ bản head để đáp ứng (không cần phải làm bất cứ điều gì), vì vậy có lẽ nó' d hoạt động giống như sử dụng head trong bộ điều khiển Rails thông thường. Nhưng không.

Điều tương tự cũng xảy ra nếu tôi thử sử dụng redirect_to ... hoặc render ... (sau khi bao gồm các mô-đun có liên quan). Vì vậy, một nơi nào đó trong Rack → Rails → Warden → Warden ứng dụng thất bại (điều khiển) mã trạng thái của phản ứng bị mất tích. Nhật ký biết để bắt đầu ghi lại yêu cầu, và biết rằng nó đã được xử lý, vì nó rõ ràng là spits ra "Hoàn thành ..." - dòng. Nhưng cái gì đó không được nối đúng.

Bất kỳ ý tưởng nào về cách sửa lỗi này?

+0

Ông có thể đẩy mã ứng dụng tối thiểu của bạn để GitHub? Coz, thiết lập thông thường là 'Rack → Warden → Rails' và không phải' Rack → Rails → Warden'. – Uzbekjon

+0

@Uzbekjon Xong. Đã có một hoặc ít hơn sẵn sàng để đi, thực sự. Bạn có thể tìm thấy nó ở đây (https://github.com/Flambino/WardenLogging_Test). Và vâng, những gì bạn đang nói có ý nghĩa hoàn toàn (đó là phần mềm trung gian sau khi tất cả), vì vậy nó cũng có thể được rằng tôi đã chỉ cần thiết lập tất cả mọi thứ lên hoàn toàn ngược. – Flambino

Trả lời

2

Warden không có bộ ghi nhật ký rails. Nó chỉ ném an exception and catch it, Warden cung cấp một cách để xử lý các ngoại lệ này bằng cách before_failure callback

# config/inializers/warden_config.rb 
Warden::Manager.before_failure do |env, opts| 
    Rails.logger.info("401 Unuthorized") 
end 
+0

Và nhật ký nói gì? Bởi vì đó là câu hỏi của tôi. Thiết lập của tôi đã hoạt động để xác thực, vv, _except_ rằng nhật ký không hiển thị trạng thái http nào đã được gửi tới máy khách. Và đó là câu hỏi của tôi – Flambino

+0

@Flambino Tôi nghĩ rằng 'warden' không tương thích với' rails' (chỉ với 'rack'). Do đó 'warden' không có' Rails.logger' được nhúng. Hãy thử sử dụng gọi lại «before_failure' (tôi đã chỉnh sửa câu trả lời của tôi) – itsnikolay

+0

Chắc chắn, tôi có thể thêm bất kỳ ghi nhật ký bổ sung nào mà tôi muốn gọi lại, nhưng tôi quan tâm đến việc có trình ghi nhật ký Rails - có vẻ như đã nhận được yêu cầu để - ghi lại phản hồi theo cách tương tự như bất kỳ phản hồi nào khác. – Flambino

Các vấn đề liên quan