ピアアシストネットワークの参加ノードに対して、機能の利用を一部制限する事ができます。今回は NetGroup とパスワードの関係についてです。
パスワードの設定
ピアアシストネットワークに対するパスワードの設定には GroupSpecifier のメソッドを使います。この事から既にお察しのとおり、パスワードは NetGroup のインスタンスを生成する前に設定しておく必要があります。また、パスワードが違うと同じグループとして扱われません。この点にも注意が必要です。
下がパスワードを設定するための GroupSpecifier クラスのメソッドです。ポストとアプリケーションレベルのマルチキャストに対するパスワードを設定することができます。
// ポストのパスワード設定 public function setPostingPassword(password:String=null, salt:String=null):void // パブリッシュのパスワード設定 public function setPublishPassword(password:String=null, salt:String=null):void
引数はどちらのメソッドも同じで、1 つ目がパスワードの文字列、2 つ目がパスワードの推測を難しくするための文字列 (ソルト) です。
上でも書いたように、同じネットワークに参加するためには同じパスワードを指定する必要がありますが、それに加えてソルトも同じでなければなりません。本来ソルトはパスワードの推測を難しくするためのものなので、ランダムに変えることが望ましいのですが、ランダムにした場合はソルトの値を共有する仕組みが必要になります (あたりまえですが)。 このあたりちょっと面倒なところです。
さて、以上のとおり、パスワードとソルトは、ピアアシストネットワークへの参加を制限します。ここまでだと、Web サイトへのパスワードと同じようなものだと思われるかもしれません。ですが、ここで設定するパスワードにはもう一つの使い道があります。
グループスペック (groupspec)
ピアアシストネットワークの参加者の中でも、発言者を限定したい、という事があるかもしれません。NetGroup にはそのようなケースに対応するべく、参加者の権限を指定できる仕組みが提供されています。
権限の指定は NetGroup のインスタンス作成時に行います。実は、NetGroup のコンストラクタの 2 つ目の引数には、参加者の権限も指定することができるのでした。
NetGroup(connection:NetConnection, groupspec:String)
この点については、マルチキャストのための NetStream のコンストラクタの第 2 引数についても同様です。
NetStream(connection:NetConnection, groupspecString = "connectToFMS")
これらのメソッドの第 2 引数に渡す文字列 (グループスペックと呼ばれてます) は、
- グループ名
- 利用できる機能
- パスワードとソルト
- 参加ノードの権限
が含まれる、長い長い文字列です。このうち、最後の 「参加ノードの権限」 だけはオプションです。
一緒のネットワークに参加するためには、最初の 3 つをあらわす文字列までは共通でなければなりません。が、最後に 「参加ノードの権限」 を付けるか付けないかは選択する事ができます。付けない場合は、権限無しでの参加という事になります。同じグループに参加できるグループスペック文字列には 2 種類あるわけです。
パスワードが設定されていない場合は、特にこの点を気にする必要はありません。つまり、参加ノードの機能を制限できるのは、その機能に対してパスワードが設定されている場合だけということです。というわけで、パスワードは、ピアアシストネットワーク内のノードに対して権限を要求する、という働きも備えています。
一旦ここで整理すると、以下の 3 つのパターンがあることになります。
- パスワード無し: 権限の有無にかかわらず機能を利用可能
- パスワード有り & 権限有り: 機能を利用可能
- パスワード有り & 権限無し: 機能を利用不可
setPostingPassword() メソッドは NetGroup.post() メソッドの使用に対してパスワードを設定します。また setPublishPassword() メソッドは NetStream.publish() メソッドの使用に対するパスワードを設定します。つまり、どちらも送信する権限を制限するためのもので、受信に対するパスワードは、ポストとマルチキャスト共にもありません。
ポストだけ、あるいはパブリッシュだけにパスワードを設定する事もできます。例えば、ポストは誰でもできるがパブリッシュは一部のノードだけといった環境が作れます。
グループスペック文字列の作成
GroupSpecifier のインスタンスからグループスペック文字列を生成する際、権限の有り無しを使い分けられるように、下の 3 つのメソッドが提供されています。
public function groupspecWithAuthorizations():String public function groupspecWithoutAuthorizations():String public function authorizations():String
上から順番に、まず groupspecWithAuthorizations() は権限付のグループスペック文字列を返します。次に、groupspecWithoutAuthorizations() は権限無しのグループスペック文字列を返します。
最後の authorizations() は権限の部分のみの文字列を返します。groupspecWithoutAuthorizations() により生成されたグループスペックの最後に authorizations() の返す文字列を足すと、groupspecWithAuthorizations() の生成するグループスペックと同じものになります。
今までのサンプルでは、グループスペックの文字列生成に toString() を使っていましたが、これは groupspecWithAuthorizations() を呼ぶのと同じ結果になります。groupspecWithAuthorizations() を使ったほうが、権限付である事がはっきりしてプログラムの意図も分かり易そうですね。 toString() を使うより下のように書いたほうがよいかもしれません。
var _groupSpecifier:GroupSpecifier = null; private function onConnect():void { // GroupSpecifier のインスタンス生成 _groupSpecifier = new GroupSpecifier(GROUPNAME); _groupSpecifier.postingEnabled = true; _groupSpecifier.serverChannelEnabled = true; _groupSpecifier.setPostingPassword(pass, salt); // NetGroup のインスタンス生成、権限付 _netGroup = new NetGroup(_netConnection, _groupSpecifier.groupspecWithAuthorizations()); _netGroup.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); }
コメントする