我的Blog我做主^_^

          走向一條通往JAVA的不歸路...

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            64 隨筆 :: 68 文章 :: 77 評(píng)論 :: 0 Trackbacks

          在我寫了SSO的文章以后,有幾個(gè)網(wǎng)友希望我能提一提跨domain的SSO的實(shí)現(xiàn)方法。其實(shí),它的實(shí)現(xiàn)方法有很多,如果不象JES Access Manager那樣要考慮性能和安全性的問題,我下面可以給出很簡(jiǎn)單的解決方案。

          跨domain的SSO的主要難點(diǎn)在于瀏覽器如何設(shè)置不同domain的cookie。所有的cookie都有一個(gè)范圍,叫domain,如“.sun.com”。這個(gè)范圍規(guī)定了只有在訪問相同domain的時(shí)候,瀏覽器才會(huì)將此cookie帶上。因此,如果SSO服務(wù)的domain和Web應(yīng)用的domain不相同的情況下,就算當(dāng)前瀏覽器已經(jīng)登錄過SSO的服務(wù),Web應(yīng)用的Agent(Filter)也不能知道。因?yàn)镾SO服務(wù)給此瀏覽器設(shè)置的cookie是Domain A的,在訪問domain B的時(shí)候,這個(gè)cookie是不會(huì)帶去的。

          另外,在servlet的API中,在設(shè)置cookie的時(shí)候是可以選擇此cookie生效的domain--setDomain()方法。知道這個(gè)以后,請(qǐng)看下圖的解釋

          10c86bad976.jpg

          如上圖,我們只需要將SSO服務(wù)稍微改動(dòng)就能完成跨domain的SSO的功能。

          讓我們一步步來看是如何實(shí)現(xiàn)的:通過步驟1、2,假設(shè)我們?cè)L問過Domain A中的應(yīng)用1,并且登錄了SSO,獲得了Domain A的cookie。步驟3在訪問Domain B的應(yīng)用2的時(shí)候,顯然此Web應(yīng)用2的Agent不會(huì)發(fā)現(xiàn)這個(gè)cookie,因?yàn)檫@是Domain B。

          步驟4,Web應(yīng)用2的Agent給瀏覽器發(fā)出重新定向到SSO登錄頁(yè)面的指令(詳細(xì)過程和原理請(qǐng)閱讀文章本身)。步驟5,瀏覽器去訪問SSO的登錄頁(yè)面。到此為止,和原來的實(shí)現(xiàn)過程都沒有什么變化。

          但是,SSO在返回給瀏覽器登錄頁(yè)面之前,可以執(zhí)行一個(gè)附加的操作,檢查一下當(dāng)前請(qǐng)求是否帶有cookie。值得注意的是,在這次訪問當(dāng)中,瀏覽器的確是將先前登錄成功的cookie帶來了,因?yàn)檫@是Domain A。在這個(gè)附加的操作中,我們可以去判斷這個(gè)cookie是否真的有效。

          如果這個(gè)cookie真的有效,這個(gè)附加的操作需要做的是給瀏覽器再設(shè)置一個(gè)cookie,cookie的名字和數(shù)值都和原來一樣,domain的范圍設(shè)置為"Domain B",并且讓瀏覽器重新定向到剛才的請(qǐng)求上(Web應(yīng)用2的請(qǐng)求)。這個(gè)請(qǐng)求的URL可以從“goto”的參數(shù)中獲得(詳細(xì)過程和原理請(qǐng)閱讀文章本身)。

          瀏覽器再次訪問Web應(yīng)用2的時(shí)候,它所希望的cookie就已經(jīng)在了。

          從用戶的角度說,可能會(huì)發(fā)現(xiàn)瀏覽器有幾次閃動(dòng)和交互,但這都是自動(dòng)的。

          http://yuwang881.blog.sohu.com/3632369.html#comment



          posted on 2007-02-01 15:31 java_蟈蟈 閱讀(248) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 萍乡市| 锡林浩特市| 南川市| 应城市| 民乐县| 新兴县| 铜鼓县| 义马市| 清河县| 郎溪县| 永顺县| 同心县| 宜君县| 克拉玛依市| 凤庆县| 大关县| 固原市| 恭城| 侯马市| 新沂市| 棋牌| 吐鲁番市| 新巴尔虎右旗| 林周县| 铜川市| 孟津县| 保德县| 明星| 靖西县| 齐齐哈尔市| 自贡市| 兴海县| 洛浦县| 襄城县| 盈江县| 体育| 界首市| 张家界市| 巧家县| 若尔盖县| 屏东县|