NOEMBLEM/エンブレムが設定されていません。

メールの詳細(メール表示)

件名:

Re: Zope 3.1 の PAU について

差出人: さん TAHARA Yusei<yusei…>
送信日時 2005/11/30 01:50
ML.NO [zope-memo:0907]
本文:

こんばんは。田原です。


> うーむ。田原さんのおっしゃっていることが、今の私にはチンプンカンプンですが、
> とりあえず、「できない」ということはわかりました。
> できないならできないで、そういうもんか、っていうだけなので参考になりました。
> ありがとうございます。

説明がうまくなくてすみません。

principalとpermission, roleの設定方法がZope3ではすごくシステマチックと
いうかすっきりした構造になっていて、とても関心しました。

例えば、あるフォルダでロールとパーミッションの関連づけをしようとすると、
Zope2ではロールとパーミッションの関連づけを行うには、Role.RoleManager
を継承したうえで、

{{{
obj.manage_permission(View, [Manager])
}}}

とやっていました。

Zope3では、zope.app.securitypolicy.interfaces.IRolePermissionManagerと
いうインターフェースがあって、名前のとおりRoleとPermissionのマッピング
を担当しています。このインターフェース用のアダプタも用意されていて、
RoleとPermissionの設定を行う対象のオブジェクトをそのインターフェースに
変換してあげてから、設定を行うという仕組みになっていました。
(IPrincipalRoleManagerとIPrincipalPermissionManagerもあります。)

{{{
#インターフェースに引数でオブジェクトを与えると、自動的にそのインター
#フェースを提供するアダプタをみつけて、それを適用したあとのオブジェクト
#を返します。
mapper = IRolePermissionManager(obj)
mapper.grantPermissionToRole(zope.View, zope.Manager)
}}}

それで、IRolePermissionManagerの実装が2つあって、どちらも
zope.app.securitypolicy.rolepermissionにあるんですが

- 永続オブジェクト用 AnnotationRolePermissionManager
- ZCMLで設定する用 RolePermissionManager

になっています。永続オブジェクト用はZopeのAnnotation機能を使っています。
Annotationは、インターフェースで定義していないデータをどこかに保存して
おいて、あたかもそのオブジェクトがインターフェースとして持っているかの
ように見せる機能で、Pythonのsetattrを使ってZope内部に隠して保存しちゃ
うAttributeAnnotationとZopeの外部に保存するAnnotationがあります。(外部
に保存する機能は自前で要実装)

AttributeAnnotaionを使う場合は、実はデータは obj.__annotations__に代入
したオブジェクトに入れておくんですが、obj.__annotations__は永続辞書型
にしておく方法が多いみたい(Zope3Bookに書いてありました)で、例えば

{{{
class IA:

title = TextLine(title=utitle)

class A:
implements(IA)

title =
}}}

みたいなクラスがあって、これをIBという別のインターフェースに変換したい
ときに

{{{
class IB:

title = TextLine(title=utitle)

class A2B:

implements(IB)
__used_for__ = IA

def __init__(self, a):
self.a = a

def title_get(self):
data = self.a.__annotations__[IB用アノーテーションデータ入れ]
return data[title]

def title_set(self, value):
data = self.a.__annotations__[IB用アノーテーションデータ入れ]
data[title] = value

title = property(title_get, title_set)
}}}

のように、もともとIAのオブジェクトをIBに変換するアダプタA2Bでは
Annotationを使って、IBのtitleの値を__annotations__に隠しておくことで、
IAのtitleをIBで壊したりしないで、それぞれのインターフェースの値をもっ
ておけるという仕組みになっているようです。(DublinCoreのデータもこうやっ
て保持しているみたいで、おかげでZope3では複数のメタデータで同じ名前の
属性を持てます。)

このAnnotationを使って、RoleとPermission、PrincipalとPermissionなどの
データを扱っているのが、永続オブジェクト用
AnnotationRolePermissionManagerのほうで、

ZCMLで設定する用のRolePermissionManagerのほうはsecuritypolicy.zcmlとか
に書いてある設定をZODBのオブジェクトに書くわけにいかないので、
rolepermission.pyのモジュール内で、
rolePermissionManager = RolePermissionManager()
のようにして、RolePermissionManagerのインスタンスをグローバル変数にし
て他のモジュールから使えるようにしておいて、

{{{
<grant permission="zope.View"
role="zope.Anonymous" />
}}}

こんな風に書いてある設定を読みこんだときに、グローバル変数の
rolePermissionManagerをimportしてきて

{{{
rolePermissionManager.grantPermissionToRole(zope.View, zope.Anonymous)
}}}

としてやる、これを毎回起動時にsecuritypolicy.zcmlを読むたびにやってい
て、それで動いているようです。



> とりあえず、ソースを覗いてみました。
> いろいろ参考になります。
>
> ところで、 app ディレクトリの下のソースって、どういう意味があるんですか?

一応、それなりに他の部分が動くようになったら、あのソフト専用のスキンと
か管理画面を作ろうと思っていて、それを入れるためのappディレクトリを作っ
てみました。が、今のところ全くできあがっていないので、現在動いている機
能とは関係なくて使っていない状態です。

あと、インストール方法を書きました。興味のあるかたは自分のパソコンで動
かしてみてくださいませ。
http://z3app.dip.jp/HowToInstall

--
Tahara Yusei
yusei@…

Gg[ubN}[N
添付:

このメールは下記のメールに対する返信です:

更新順メールリスト