如何利用Filter Chain

7 views
Skip to first unread message

Henry Juan

unread,
Sep 26, 2007, 11:03:37 AM9/26/07
to Seagull中文
如何利用Seagull的Filter Chain机制解 SSO(Single Sign-On), 其他系 (例如 系 )使用者登 与
Seagull系 合,例如已 在Seagull系 登入就 在 系 再作一次登入。

Xinhao Zheng

unread,
Sep 26, 2007, 11:33:40 AM9/26/07
to seagul...@googlegroups.com
Henry,
因为我们不想去hack SGL的代码(考虑到更新和弹性)。所以你只需要自定义一个
链,一个站点级的链:

1、定义一个task,可以参考SGL的task
class SGL_Task_SingleSignOn extends SGL_DecorateProcess
{
//do what you want,of course,most of the time you want to set session
for all sites(SGL及第三方模块)。
}
2、$conf['site']['filterChain'] = '';//逗号隔开的filterchiain

注意:默认你的这个类应该是放到[SGL_CORE_LIB]/Task/SingleSignOn.php文件
中。当然你可以把你的chain放到自己想放的目录下,不过起名就不能这么起了。

另外,如果是要用filter这个来实现的话,建议最好是将chain放在后期处理
(post process).

之所以说另外是因为,这个目标应该用user模块的observer来实现。详细请见:

http://wiki.cjcht.com/howto/pragmaticpatterns/observers?s=observer
http://wiki.cjcht.com/howto/pragmaticpatterns/interceptingfilter?s=observer

Henry Juan

unread,
Sep 28, 2007, 4:07:16 AM9/28/07
to Seagull中文
謝謝大師! 但是我有一個問題,使用者登入Seagull系統後不一定要使用購物車或論壇,若是將RestoreCart,DoFudLogin放進
LoginMgr的observers,每一次login都必須做這兩件事,是不是浪費時間? 再者,像GetUserGeoCode這種任務,通常需
要花很久時間,observers一個一個執行下來,負擔太重了。因此我認為用Observer模式來解這個問題(已經在Seagull登入就不需要在
其他系統登入) 不太理想。反而在FilterChain中間掛一節SGL_Task_SingleSignOn鏈,判斷URL為何,若是外部系統則使
用delegation,調用外部系統的 login API。如何檢查帳號密碼是封裝在外部系統內,Seagull系統不需要知道。不知行不行的通
呢?

Xinhao Zheng

unread,
Sep 28, 2007, 8:52:04 AM9/28/07
to seagul...@googlegroups.com
Henry,

你的观点有一定的道理。我认为:

1、observer只会在特定的action下发生(侦听)。相反,filter是在每个request
都要执行的动作。observer和 filter一样有弹性,而且彼此之间几乎没有依赖
性。没有人规定你一定要有多少个observer。而且登陆不会在每次request中发生。

2、至于调用外部系统的API,delegate模式是一种方法。SGL也支持类似于.NET的
web service。SGL的开放性是蛮强的,尽管还末成熟(请参看
SGL_CORE_LIB/Services、SGL_CORE_LIB/XML)。集成 GOOGLE的API(Map,
Gallery)及PayPal的功能已经在做了,而且相信不会太久。

3、事实上,我认为,这个问题应该分成两个情况来看。调用和不调用第三方的API
来实现SSO。调用的话,是出于两者(即SGL和第三方)使用各自的 user表甚至库
(如你想把你的论坛对外开放)。不调用的话,我们只要事先知道第三方所需要的
session,在SGL登陆时顺便给它伪造一个第三方识别的session。

4、你最后的问题在SGL集成FUD已经回答了,简单的包含FUD提供的登陆API,在SGL
登陆时进行双重登陆(用户是不知道了)。参看:http:
//wiki.cjcht.com/integration/fudforum?s=fud

不知我有没有误解你的观点,请指正。

george

Reply all
Reply to author
Forward
0 new messages