« 三鷹天命反転住宅とプロペラカフェとか・・・ | Home | URLStreamでFLVを再生する »

Apr 132009

SecurityDomain周り

SecurityDomainで諸々メモ。(まだ間違っている部分があるかもしれない)

条件
・セキュリティポリシーファイルを読込先サーバに配置できない
として、どーやってそのサーバに配置されているソースを読み込むか?ということでProxyのような働きをするswfを用意し、それを介して読込先サーバのリソースにアクセスしてみるようなかんじ。


・Security.allowDoaminの設定。
Security.allowDoamin("*")でも良いが、危険なので

親:Security.allowDomain(loader.contentLoaderInfo.url);
子:Security.allowDomain(this.root.loaderInfo.loaderURL);
な感じで動的に設定した方がよさげ。


・LoaderContextの設定
checkPolicyFile = false;
securityDomain =null;
これらを設定するとcrossdomain.xmlを参照し、その時点で停止。
ApplicationDoaminの設定は問題ないが、Security.allowDoamin前に確認されるからか、適応されないっぽい。まぁLoaderContext無しで動くようにする必要がある。


・子swf内クラスのイベント
取得するにはdispatchを受け付けるように、親にもSecurity.allowDoaminが必要(当たり前ですが)


・子swfでのクラス定義のタイミング
ポリシーファイルが定義されている場合は、子swfの変数として
var a:hoge = new Hoge()
見たいにして定着させるが、Security.allowDoaminで開放する場合には、解放後定義しないと参照できない。つまりコンストラクタで

Security.allowDomain(this.root.loaderInfo.loaderURL);
とした後に new Hoge(); 等と空打ちして焼き付ける。


・子swfのクラスの取得
SecurityDomainが同じ場合は、ApplicationDoamin.currentDoamin.getDefinitionでクラスを取得できるが、前述の通りSecurityDomainが異なるためApplicationDoamin.currentDoaminに子swfが含まれていない。このため

loader.contentLoaderInfo.applicationDomain.getDefinition("Hoge") as Class;
みたいに取得する。ただし、これを親クラス側で変数に代入して流用は可能。
var hogeClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("Hoge") as Class;
var hoge = new hogeClass();
ただし型指定をするとエラーになる。 簡単なのは子クラスを格納するクラスを作って、その中にStaticで格納するのが楽。


・Loader系
子swfで定義されたLoader拡張クラスを、親swfでgetDefinitionして取得した後は、親でインスタンス化しても使用可能。ただしcontnt等セキュリティエラーに抵当するプロパティもある。例えばBitmapDataを取得したい場合は、子swfに含まれるLoader拡張クラスの中で、BitmapData化して引き渡すなどの処理が必要。

public function get bmd():BitmapData 
{
	var bmd:BitmapData = new BitmapData(content.width, content.height);
	bmd.draw(content);
	return bmd;
}
こんなかんじ?このBtimapは親で自由に使える。Sprite系なども基本newしてしまえば自由に使えるが、SecurityDomainを超えた要素はやはりセキュリティエラーになるので注意。(この辺ローカルでは確認できないので、サーバ上で確認するしかないのだけど・・、そこが非常に面倒)


ただリダイレクト系の分散負荷のシステムだと、結局このproxySWFとそこから呼ばれるソースのIPがまた変わってしまうという延々とループな感じの挙動にってしまう。イメージやらswfやらが対象であればバイナリ化してLoadしたほうが圧倒的に楽。ただFLVの場合が・・・・汗

ということでとりあえずメモ。

1 Comment

いやbinaryでやり取りするにしても解決するのはApplicationDomainぐらいか?なんかどっかHelpにそんな記述があったような記憶があるのだけど、どこだか思い出せない。(ヘルプにpostit機能を付けてくれないか?)

Leave a comment

Search and Archives