首页 > Erlang并发教程 > 10.12 Erlang并发编程-认证
2013
11-20

10.12 Erlang并发编程-认证

BACK TOP文章索引

  1. 认证
  2. 共3条评论

认证

Erlang系统采用“magic cookies”的方式内建了认证支持。Magic cookie是分配给各个节点的一个保密原子式。每个节点在启动时都会被自动分配一个随机cookie。节点N1要想和节点N2通讯,就必须知道N2的magic cookie。这里不讨论N1如何找出N2的cookie。为了令N1得以和N2通讯,N1必须执行erlang:set_cookie(N2, N2Cookie),其中N2CookieN2的cookie值。另外,要令N1能够收到来自N2的响应,N2也必须执行erlang:set_cookie(N1, N1Cookie,其中N1CookieN1的cookie值。

Erlang运行时系统会将cookie插入到发送给所有远程节点的所有消息中。若一条消息抵达某节点时携带着错误的cookie,则运行时系统会将这条消息转换为以下格式:

{From,badcookie,To,Message}

其中To是消息接收方的Pid或注册名而From是发送方的Pid。所有未认证的消息发送请求和进程创建请求都会被转为badcookie消息并发送至net_kernelnet_kernel可以任意处置badcookie消息。

以下两个BIF可用于cookie操作:

erlang:get_cookie()

返回自己的magic cookie。

erlang:set_cookie(Node,Cookie)

将节点Node的magic cookie设置为Cookie。获得Node的cookie后可以使用该BIF。它将令后续发送给Node的所有消息都包含Cookie。如果Cookie确实是Node的magic cookie,则消息将直接被发送至Node上的接收进程。如果包含的cookie有误,该消息将在接收端被转为badcookie消息,再被发送至那里的net_kernel

默认情况下,所有节点都假定所有其他节点的cookie是原子式nocookie,因此初始时所有的远程消息都包含cookie nocookie

若调用erlang:set_cookie(Node, Cookie)Node的值为本地节点的名字,则本地节点的magic cookie将被设置为Cookie,同时,其他所有cookie值为nocookie的节点都会变为Cookie。如果所有节点都在启动时执行:

erlang:set_cookie(node(), SecretCookie),

则它们将自动互相认证以便协作。应用如何获取到SecretCookie是一个实现问题。保密cookie应保存于一个仅能由用户读取或仅能由用户组读取的文件中。

在UNIX环境下,节点启动后的默认行为是读取用户HOME目录下名为.erlang.cookie的文件。首先将会对文件的保护权限进行检查,然后便会调用erlang:set_cookie(node(), Cookie),其中Cookie是包含cookie文件内容的原子式。之后,同一用户就可以安全地与其他所有在相同用户ID下运行的Erlang节点进行通讯了(假设所有节点都在同一文件系统下运行)。如果节点驻留在不同的文件系统中,用户只须保证涉及到的文件系统中的cookie文件的内容相同即可。


10.12 Erlang并发编程-认证》有 3 条评论

  1. 政治觉悟高,呵呵,怎么感觉有点恐吓的意思

  2. 政治觉悟高,呵呵,怎么感觉有点恐吓的意思

  3. 灵根。。灵根我什么我想起了风起苍岚?????

留下一个回复

你的email不会被公开。