【问题标题】:Multiple connections in ActionCableActionCable 中的多个连接
【发布时间】:2017-05-31 01:44:00
【问题描述】:

我的应用中有两个设计身份验证模型,并希望在它们之间创建一个聊天。有人可以帮我为用户编写连接吗?下面是我所拥有的。我想检查我是否可以让两个连接根据他们的个人登录拒绝不同用户的连接。任何帮助表示赞赏。

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user
    identified_by :current_supplier

    def connect
      self.current_user = find_verified_user
      self.current_supplier = find_verified_supplier
    end

    private
      def find_verified_user
        if current_user = env['warden'].user('user')
          current_user
        end
      end

      def find_verified_supplier
        if current_supplier = env['warden'].user('supplier')
          current_supplier
        else
          reject_unauthorized_connection
        end
      end
  end
end

【问题讨论】:

    标签: devise ruby-on-rails-5 actioncable


    【解决方案1】:

    改编自this tutorial:

    # app/channels/application_cable/connection.rb
    
    module ApplicationCable
      class Connection < ActionCable::Connection::Base
        identified_by :current_supplier, :current_user
    
        def connect
          find_verified
        end
    
        protected
    
        def find_verified
          setup_user     if verified_user
          setup_supplier if verified_supplier
    
          reject_unauthorized_connection unless [current_supplier, current_user].any?
        end
    
        def verified_user
          cookies.signed['user.expires_at'].present? &&
            cookies.signed['user.expires_at'] > Time.zone.now
        end
    
        def verified_supplier
          cookies.signed['supplier.expires_at'].present? &&
            cookies.signed['supplier.expires_at'] > Time.zone.now
        end
    
        def setup_supplier
          self.current_supplier = Supplier.find_by(id: cookies.signed['supplier.id'])
          logger.add_tags 'ActionCable', "#{current_supplier.model_name.name} #{current_supplier.id}"
        end
    
        def setup_user
          self.current_user = User.find_by(id: cookies.signed['user.id'])
          logger.add_tags 'ActionCable', "#{current_user.model_name.name} #{current_user.id}"
        end
      end
    end
    

    还有:

    # config/initializers/warden_hooks.rb
    
    Warden::Manager.after_set_user do |user, auth, opts|
      scope = opts[:scope]
      auth.cookies.signed["#{scope}.id"] = user.id
      auth.cookies.signed["#{scope}.expires_at"] = 30.minutes.from_now
    end
    
    Warden::Manager.before_logout do |_user, auth, opts|
      scope = opts[:scope]
      auth.cookies.signed["#{scope}.id"] = nil
      auth.cookies.signed["#{scope}.expires_at"] = nil
    end
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2017-11-30
      • 2018-03-22
      • 2019-04-11
      • 1970-01-01
      • 2015-12-15
      • 2017-02-03
      • 1970-01-01
      相关资源
      最近更新 更多