类:Mongo::Server::PendingConnection Private

继承:
ConnectionBase 显示全部
扩展方式:
可转发
定义于:
build/Ruby-driver-v 2.19 /lib/mongo/server/pending_connection.rb

Overview

此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。

该类封装握手和身份验证期间的连接。

由于:

  • 2.0.0

常量摘要

ConnectionBase继承的常量

ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZEConnectionBase::MAX_BSON_COMMAND_OVERHEADConnectionBase::REDUCED_MAX_BSON_SIZE

Loggable中包含的常量

Loggable::PREFIX

实例属性摘要折叠

ConnectionBase继承的属性

#description#options#server

包含在Monitoring::Publishable 中的属性

#monitoring

ConnectionCommon继承的属性

#compressor , #pid

实例方法摘要折叠

ConnectionBase继承的方法

#app_metadata#dispatch#Generation#service_id

Monitoring::Publishable 中包含的方法

#publish_cmap_event#publish_event#publish_sdam_event

Loggable中包含的方法

#log_debug#log_error#log_ Fatal#log_info#log_warn#logger

ConnectionCommon继承的方法

#connected? , #handshake_command , #handshake_document

构造函数详情

#initialize (socket, 服务器, 监控, options = {}) ⇒ PendingConnection

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 PendingConnection 的新实例。

由于:

  • 2.0.0



27
28
29
30
31
32
33
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/pending_connection.rb', 第27行

def 初始化(套接字, server, 监控, 选项 = {})
  @socket = 套接字
  @options = 选项
  @server = server
  @monitoring = 监控
  @id = 选项[:id]
end

实例属性详细信息

# ID =" Integer " (只读)

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回 连接的 ID。 这与创建此 PendingConnection 实例的常规 Connection 对象的 ID 相同。

返回:

  • ( Integer )

    连接的 ID。 这与创建此 PendingConnection 实例的常规 Connection 对象的 ID 相同。

由于:

  • 2.0.0



38
39
40
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/pending_connection.rb', 第38行

def id
  @id
end

实例方法详细信息

#handshake_and_authenticate!对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.0.0



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'build/Ruby-driver-v 2.19 /lib/mongo/server/pending_connection.rb', 第40行

def 握手和身份验证!
  speculative_auth_doc = nil
  if 选项[: user] || 选项[:auth_mech]
    # 要创建身份验证实例,我们需要指定机制,
    # 但目前我们还不知道最终的机制
    # 将被使用(因为这取决于返回的数据
    # 握手,特别是服务器版本)。
    # 但是,我们知道只有4.4 + 服务器支持推测性
    # 身份验证,这些服务器通常也支持
    # SCRAM-SHA- 256 。 我们预计为4.4创建的用户帐户 +
    # 服务器通常允许SCRAM-SHA- 256身份验证;
    从4.4之前的服务器迁移的 # 个用户帐户可能只允许
    # SCRAM-SHA- 1 。 因此,默认使用 SCRAM-SHA- 256
    # 合理,也是推测性身份验证规范所强制执行的。
    # 如果没有指定机制,并且我们正在与3.0 +
    #服务器,我们将发送推测性身份验证文档,服务器将
    # 忽略它,我们将使用显式执行身份验证
    # 在将机制默认为 CR 后执行的命令。
    # 如果没有指定机制,并且我们正在与4.4 +
    #服务器和用户帐户不允许SCRAM-SHA- 256 ,我们将
    # 使用 SCRAM-SHA- 1在单独的命令中进行身份验证
    # 进行SCRAM机制协商。
    default_options = 选项::已编辑.new(:auth_mech => :scram 256)
    speculative_auth_user = auth::user.new(default_options.合并(merge)(选项))
    speculative_auth = auth.获取(speculative_auth_user, self)
    speculative_auth_doc = speculative_auth.对话.speculative_auth_document
  end

  结果 = 握手!(speculative_auth_doc: speculative_auth_doc)

  if 描述.未知?
    提高 错误::内部驱动程序错误, " 成功握手后,连接描述不能为未知: #{ description.inspect} "
  end

  开始
    if speculative_auth_doc && (speculative_auth_result = 结果[' speculativeAuthenticate '])
      除非 描述.功能.Scram_sha_ 1 _enabled?
        提高 错误::InvalidServerAuthResponse, 在3.0之前的服务器上,推测性身份验证成功
      end
      案例 speculative_auth_user.机制
      when :mongodb_x 509
        # Done
      # 我们默认将身份验证机制设置为SCRAM 256,但如果用户指定
      # SCRAM明确表示我们可以进行推测性身份验证
      # with SCRAM .
      when :scram, :scram 256
        验证!(
          speculative_auth_client_nonce: speculative_auth.对话.client_nonce,
          speculative_auth_mech: speculative_auth_user.机制,
          speculative_auth_result: speculative_auth_result,
        )
      else
        提高 错误::内部驱动程序错误, " 机制 #{ speculative_auth_user . Mechanism . Inspect } 的推测 性身份验证意外成功 "
      end
    elsif !描述.仲裁节点?
      验证!
    end
  救援 mongo::错误, mongo::错误::AuthError => 排除
    排除.service_id = service_id
    提高
  end

  if 描述.未知?
    提高 错误::内部驱动程序错误, "成功身份验证后,连接描述不能为未知: #{ description .inspect } } "
  end

  if server.load_balancer? && !描述.mongos?
    提高 错误::BadLoadBalancerTarget, " 负载均衡操作需要连接 mongos,但位于 # {address.seed } } 的 服务器 将 自身 报告 为 # { { description.server_type.to_s.gsub ( ' _ ' ,' ' ) } "
  end
end