簡體   English   中英

從rails / lib模塊中對用戶進行身份驗證

[英]Authenticate User from within rails /lib module

我想在用戶嘗試在我的Rails應用程序中啟動TCP連接時對用戶進行身份驗證。 這是我當前擁有的代碼,它非常簡單,但是應該讓您了解我想做什么。

TcpServer.rb

module TcpServer

  def receive_data(data)
    (@buf ||= '') << data
    if line = @buf.slice!(/(.+)\r?\n/)
      commands = data.split(";")
      case commands[0]
      when /start/i
        if !User.authenticate(commands[1],commands[2])
          close_connection
          puts "Subscription invalid."
        else
          put "Subscription validated."
        end
      end
    end
  end

EventMachine::run do
  host = "localhost"
  port = "5587"
  EventMachine::start_server host, port, TcpServer
  puts "TcpServer started @ #{host}:#{port}"
end

end

為了從該模塊訪問我的用戶模型,我需要或包含哪些內容? 還是這只是一種完全不正確的方法? 如果是這樣,您有什么建議?

問題是我沒有在Rails上運行它。

我在運行它:

ruby lib/TcpServer.rb

而不是:

script/runner lib/TcpServer.rb

無需包含或不需要,Rails會自動完成。

Dir.glob(Rails.root.join('app/models/*.rb')).each { |file| require file }

上面的代碼將在需要時加載所有模型(如果需要,您可以將'user.rb'添加到語句中,在上面的注釋中,您可能需要指定路徑並且不包括“ .rb”部分->“需要“用戶””)。

您應該決定是否認為這種類型的集成服務器應該是正在運行的Rails應用程序的一部分,還是應該屬於同一代碼庫的另一個“應用程序”。 您可以在此處保留核心內部組件,並使用自定義的rake任務啟動EM服務器,並通過該rake任務加載Rails env。

namespace :tcp do  
  task :start, :needs => :environment do
    # server load and start here
  end
end

如果我要打開一種新的執行方式,那么我寧願讓它們在單獨的進程中運行,以防止任何錯誤導致兩者並存。 (我將Resque作業/工作人員視為一個很好的示例,該示例說明如何將代碼保留在同一Rails應用程序中而不強制它們在同一進程中運行)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM