2008/12/30

Plone PAS

PAS (Pluggable Authentication Service) 在 Plone 2.5 之後,成為會員管理的標準機制,在此之前使用的則是 User Folder,相同的是,這兩種機制都會在 ZMI 裡出現 acl_users 物件項目。由於 User Folder 架構擴充性不足,想要新增功能時,就得設計新的 User Folder,諸如 GRUF、LDAPUF、PUF 等,都是衍生產物,而且,更換 User Folder 並不是平順簡單的過程。

PAS 則是採取 plugin 方式來擴充功能,像是處理 role、authentication、identification、property 等資訊,具體的例子如 GMail Authentication 可以讓使用者以 GMail 帳號密碼來登入,或 NTLM Authentication 可以讓 Windows domain 裡的使用者自動登入,而整合 LDAPRelational Database 也是常見的方式。

2008/11/21

buildout with MinGW

在 Plone 下載網頁,看得到 Windows 版本的 builout installer 了。
與傳統 Windows installer 不同的地方,主要是目錄架構改變了,這倒容易習慣,但使用 buildout 時,經常會用到 C 編譯器環境,則需要花些工夫準備。
MinGW 為例,先下載 Automated MinGW Installer 安裝,例如裝在 C:\MinGW 目錄,到 C:\MinGW\libexec\gcc\mingw32\3.4.5 目錄把 cc1.exe 和 collect2.exe 複製到 C:\MinGW\bin 目錄,下載 libpython24.a 放到 C:\MinGW\lib 目錄,再把 C:\MinGW\bin 加到系統環境變數 PATH 裡。
在 shell 裡執行 gcc --version 測試是否成功。
接著要通知 Python 的 distutils 已可以使用 MinGW,以 Plone 安裝在 C:\Plone3 目錄為例,要到 C:\Plone3\python\Lib\distutiles 目錄裡建立 distutils.cfg 檔案,內容是

[build]
compiler=mingw32

我有遇到 "missing structmember.h" 之類的訊息,處理方法是,下載 Python 原始碼檔案,複製 Include 目錄到 C:\Plone3\python\Include 目錄。
如果想要 Plone 以 Windows service 方式執行,可以先用 bin\instance install 指令,日後就可以直接使用 bin\instance start 或 stop 來啟動或關閉。
如果 Windows 使用防火牆,用 bin/instance fg 啟動後,系統會提示是否要打開 port。
其他更多的設定細節,可以參考 Using buildout on Windows 文件。

2008/11/04

Allowed Member ID in Plone

填寫 Plone 會員註冊表單時,會員名稱 (User Name) 預設不能使用空白或特殊符號,甚至第一個字元必須是英文字母,因此,像電郵信箱或整排數字,預設是不合法的會員名稱。
執行檢查的程式位於 CMFCore/RegistrationTool.py 檔案,原始碼片斷如下:

class RegistrationTool(UniqueObject, SimpleItem):

""" Create and modify users by making calls to portal_membership.
"""

implements(IRegistrationTool)
__implements__ = (z2IRegistrationTool, )

id = 'portal_registration'
meta_type = 'CMF Registration Tool'
member_id_pattern = ''
default_member_id_pattern = "^[A-Za-z][A-Za-z0-9_]*$"
_ALLOWED_MEMBER_ID_PATTERN = re.compile(default_member_id_pattern)

其中的 default_member_id_pattern 就是預設的合法名稱樣版,它使用 regular expression 格式,意思是說,開頭字元必須使用英文字母,接著的字元也必須是英文字母或數字或底線符號。
例如,想要限用電郵信箱當作會員名稱,可用的條件格式是 ^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$
關於使用電郵信箱當會員名稱的缺點,根據 Anton Stonor 表示,這容易導致隱私資料外漏,因為 template 裡大量用到 ID 資料。

2008/10/16

VIM with Mandriva

在 Mandriva 上使用 VIM 遇過輸入中文,會產生亂碼的現象,例如輸入「中文」這兩個字,「中」是正常,但「文」就變成亂碼,原本都從修改 LC_* 或 TERM 環境變數下手處理,成效不彰。最近發現,出問題的主機都只裝 vim-minimal 而沒有 vim-enhanced 檔案,把 vim-enhanced 補上,就好了,特此一格。

2008/10/14

Security in Plone3

網站的安全機制 (security) 由 Zope 在系統底層負責,管理員和開發者應該了解「權限」「角色」「使用者」「群組」等概念,才能發揮安全機制帶來的便利。

首先,要有足夠的權限才能存取網站內容,不然,會遇到 AccessControl.Unauthorized 的訊息回應。權限 (permission) 並不是直接對應給使用者 (user),而是先被指定給角色 (role),再經角色指定給使用者。

一位使用者,可以被指定多種角色,生效範圍可以是全站性,或是只在特定目錄裡生效。角色也可以指定給群組 (group),如此一來,群組裡的使用者就具備被指定的角色。


在 ZMI 裡 Security 頁籤,可以看到整個系統的「安全列表」,多數權限項目的「Acquire permission settings?」選項是打勾狀態,表示「會繼承上一層目錄的權限結果」,在此情況下,角色設定的效果會再加上去。

一般情況下,並不需要去更改安全列表的設定狀況,即使需要調整,也應該只更改網站根目錄的設定值。除此之外的情況,都會讓整個安全機制變得很複雜。

權限是安全機制裡的最小單位,網站應用軟體如果用到安全機制,通常是要檢查權限,而不是檢查角色。檢查使用者或群組名稱,通常不是好主意。

Professional Plone Development 書中第 83 頁,提到 "Security-aware code should almost always check for permissions, rather than roles. Checking for specific user or group names is rarely a good idea, because roles can change depending on the current context and security policy of the site." 我猜,它的意思是「檢查角色、使用者名稱、群組名稱,都應該盡量避免」吧。

2008/10/12

My Folder in Plone3

在 Plone3 之前,登入會員帳號後,可以在 personal bar 看到 my folder 的連結項目,但在 Plone3 之後,已取消這樣的呈現方式。

也就是說,即使在 Site Setup 裡 Security 選項,把 Enable User Folders 打勾生效,僅管登入會員帳號後,可用 /Members/myuser 之類的網址找到 myuser 使用者的個人目錄,但在 personal bar 還是找不到 my folder 的連結項目。
如果想要「恢復」原本的呈現效果,可到 ZMI 設定,進入 portal_actions 裡會看到 user 或 portal_tabs 之類的 CMF Action Category 項目,再新增一個 CMF Action 項目 ID 可指定為 myfolder,Title 指定為 My Folder,I18n Domain 指定為 plone,URL (Expression) 指定為 string:${portal/portal_membership/getHomeUrl},Condition (Expression) 指定為 python:(member is not None) and (portal.portal_membership.getHomeFolder() is not None),Permissions 指定為 View,將 Visible 打勾,最後按 Save Changes 確認。
這樣就會在 personal bar 看到 My Folder,但如果想要調整它呈現的位置順序,例如在 Log out 之前,可以利用 Up / Down 按鈕來調整。
詳細的說明可參考 http://dev.plone.org/plone/ticket/7075

2008/10/03

Plone Debug Mode

首先,要找到 etc 目錄裡的 zope.conf 檔案,確認設定值是 debug-mode on 的狀態。如果前面有「#」符號,表示是「註解」之意,要移掉「#」符號。

其次在 ZMI 裡找到 portal_css 項目,進入後在 CSS Registry 頁籤,會看到 Debug/development mode 選項,把它打勾,表示要讓 debug mode 生效。
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxMa9weziPIEYh6PyQI1OOLHsFssVFHa0HjwPvgG7zllBG6ADnuafYs6sZ6SNxuYWUhlCxsOOqDgBHFvPJnDWezho6AILfZaTqKNWorx_QcxhNOC74iyc3N99U7n9OVA0QhzI3CQcd0HyV/s800/portal_css-debug.png

同樣在 ZMI 裡找 portal_javascripts 項目,把 Debug/development 選項打勾生效。
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvt7l3ibLUSc_DRj7bkJTV9wfwonU9Rwzhx0fuxSTFXZLcBoG81Da7RBSUxS1UymXpmqz16Sa3QHQZnXkew18-gqCEUMJ1YBYlZepCL3kIMDrql-BXZQuo6SU3Ss5z8jTauAYaI4jWyifp/s800/portal_js-debug.png

如果沒把 debug mode 生效的話,修改結果不會即時反應。

如果不想經常重新啟動 Zope,可以安裝 plone.reload,最簡單的方法,是在 buildout.cfg 裡的 egg 與 zcml 設定區塊,指定 plone.reload 模組,重新執行 buildout 並以 Manager 身份登入後,透過 http://localhost:8080/@@reload 之類的網址,就可以 Reload Code 或 Reload ZCML 了。
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiK0OKuHp-4lMjK1RDRafbwzNF_CotMkp-lu2SnDrkSxXIfpG51R7h5eFDjM2rS29PRGOUtYLZpJsXKZsefv5yqA3ggz441l99FMGr-SH7qirnFFxwtYxoMkkq5Zs9V-fT1JWdXwyGgZdd/s800/plone-reload-action.png