ACL 类

简单的访问控制列表。

访问控制列表由“允许”和“拒绝”两部分组成,用于控制访问。使用“all”或“*”匹配任何地址。要匹配特定地址,请使用 IPAddr 可以理解的任何地址或地址掩码。

示例

list = %w[
  deny all
  allow 192.168.1.1
  allow ::ffff:192.168.1.2
  allow 192.168.1.3
]

# From Socket#peeraddr, see also ACL#allow_socket?
addr = ["AF_INET", 10, "lc630", "192.168.1.3"]

acl = ACL.new
p acl.allow_addr?(addr) # => true

acl = ACL.new(list, ACL::DENY_ALLOW)
p acl.allow_addr?(addr) # => true

常量

ALLOW_DENY

默认为允许

DENY_ALLOW

默认为拒绝

VERSION

ACL 的当前版本

公共类方法

new(list=nil, order = DENY_ALLOW) 点击切换源

使用 listDENY_ALLOWALLOW_DENY 的评估 order 创建新的 ACL

ACL list 是一个“允许”或“拒绝”的 Array,以及一个地址或地址掩码,或“all”或“*”以匹配任何地址

%w[
  deny all
  allow 192.0.2.2
  allow 192.0.2.128/26
]
# File lib/drb/acl.rb, line 179
def initialize(list=nil, order = DENY_ALLOW)
  @order = order
  @deny = ACLList.new
  @allow = ACLList.new
  install_list(list) if list
end

公共实例方法

allow_addr?(addr) 点击切换源

允许来自 addrinfo addr 的连接吗?它必须格式化为 Socket#peeraddr

["AF_INET", 10, "lc630", "192.0.2.1"]
# File lib/drb/acl.rb, line 203
def allow_addr?(addr)
  case @order
  when DENY_ALLOW
    return true if @allow.match(addr)
    return false if @deny.match(addr)
    return true
  when ALLOW_DENY
    return false if @deny.match(addr)
    return true if @allow.match(addr)
    return false
  else
    false
  end
end
allow_socket?(soc) 点击切换源

允许来自 Socket soc 的连接吗?

# File lib/drb/acl.rb, line 191
def allow_socket?(soc)
  allow_addr?(soc.peeraddr)
end
install_list(list) 点击切换源

ACL 条目的 list 添加到此 ACL

# File lib/drb/acl.rb, line 223
def install_list(list)
  i = 0
  while i < list.size
    permission, domain = list.slice(i,2)
    case permission.downcase
    when 'allow'
      @allow.add(domain)
    when 'deny'
      @deny.add(domain)
    else
      raise "Invalid ACL entry #{list}"
    end
    i += 2
  end
end