9

Tài nguyên hiện hoạt có thể sử dụng bộ xác thực HTTP ở cấp lớp. Ví dụ:Chủ đề có an toàn để đặt xác thực HTTP tài nguyên hoạt động trên cơ sở từng người dùng không?

class Resource < ActiveResource::Base 
end 

Resource.user = 'user' 
Resource.password = 'password' 

hoặc

Resource.site = "http://user:[email protected]/" 

Nhưng nếu tôi sử dụng xác thực HTTP khác nhau trên cơ sở đó người dùng được đăng nhập? Nếu tôi thay đổi Resource.user và Resource.password, điều đó sẽ gây ra tình trạng cuộc đua khi yêu cầu từ một chuỗi đột nhiên bắt đầu sử dụng xác thực của người dùng có yêu cầu đang chạy đồng thời trong một luồng khác không? Hoặc đây có phải là sự cố không (miễn là tôi đặt lại xác thực giữa các yêu cầu) vì các máy chủ đường ray không đa luồng?

Ngay cả khi không có vấn đề an toàn chủ đề, vẫn có vẻ nguy hiểm nếu tôi không đặt lại chúng, thông tin đăng nhập của người dùng trước đó sẽ được tự động sử dụng bởi các yêu cầu trong tương lai.

Cập nhật: Sau khi bị thất vọng với ActiveResource, tôi đã viết thư viện REST của riêng tôi: https://github.com/DeepWebTechnologies/well_rested

Trả lời

7

khỉ vá các host, userpassword phương pháp ActiveResource::Base lớp:

class ActiveResource::Base 
    # store the attribute value in a thread local variable 
    class << self 
    %w(host user password).each do |attr|    

     define_method(attr) do 
     Thread.current["active_resource.#{attr}"] 
     end 

     define_method("#{attr}=") do |val| 
     Thread.current["active_resource.#{attr}"] = val 
     end 
    end 
    end 
end 

Bây giờ thiết lập thông tin đăng nhập trong mọi yêu cầu

class ApplicationController < ActionController::Base 

    around_filter :set_api_credentials 

private 

    # set the credentials in every request 
    def set_api_credentials 
    ActiveResource::Base.host, 
     ActiveResource::Base.user, 
     ActiveResource::Base.password = current_user_credentials 
    yield 
    ensure 
    ActiveResource::Base.host = 
     ActiveResource::Base.user = 
     ActiveResource::Base.password = nil 
    end 

    DEFAULT_HOST, DEFAULT_USER, DEFAULT_PASSWORD= [ 
    "http://www.foo.com", "user1", "user78102" ] 

    def current_user_credentials 
    current_user.present? ? 
     [ current_user.host, current_user.login, current_user.password] : 
     [ DEFAULT_HOST, DEFAULT_USER, DEFAULT_PASSWORD] 
    end 

end 
+1

Điều này có nghĩa là có, điều đó gây ra tình trạng chạy đua không? Hay đây chỉ là một biện pháp phòng ngừa? –

+0

Có, trong chế độ sản xuất, bạn có thể chạy trong điều kiện chủng tộc nếu bạn muốn thay đổi thông số kết nối theo yêu cầu. Sử dụng biến cục bộ Thread sẽ giải quyết vấn đề này. –

+0

Tôi có giải pháp tương tự để đặt 'self.site' không có vấn đề về điều kiện chủng tộc http://stackoverflow.com/questions/8623204/set-site-user-fields-in-activeresource/9053643#9053643 – troex

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