真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java版的單點(diǎn)登錄代碼 單點(diǎn)登錄 java

Java實(shí)現(xiàn)單點(diǎn)登錄(多域)

代碼不能帖給你 不好意思....

為迎江等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及迎江網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、迎江網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

使用 CAS-server組件 一般的,單點(diǎn)登錄都是使用LDAP數(shù)據(jù)庫

我之前給學(xué)校做過一個(gè)基于SOA的校園統(tǒng)一管理構(gòu)建 使用的就是這套配置 不錯(cuò)呀不錯(cuò) 呵呵~~

單點(diǎn)登錄的重點(diǎn)是:無論兩個(gè)網(wǎng)站地域和服務(wù)器是否分離,只要他們服務(wù)器上面都有你單點(diǎn)登錄服務(wù)器上的證書存根即可... 所以不需要關(guān)心什么域名之類的東西 只要證書存根在每個(gè)網(wǎng)站上 一切好說

你的思路有些問題:單點(diǎn)登錄并不是對(duì)網(wǎng)站cookies的傳遞 它是基于https的一種安全機(jī)制的東東 也就是ca證書 如果用cookies傳遞的話,你就會(huì)遇到跨網(wǎng)站時(shí)cookies共享問題,這是個(gè)思路死角

用java來實(shí)現(xiàn)單點(diǎn)登錄大概有哪些種方法

1 什么是單點(diǎn)登陸

單點(diǎn)登錄(Single Sign On),簡(jiǎn)稱為 SSO,是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。SSO的定義是在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。

較大的企業(yè)內(nèi)部,一般都有很多的業(yè)務(wù)支持系統(tǒng)為其提供相應(yīng)的管理和IT服 務(wù)。例如財(cái)務(wù)系統(tǒng)為財(cái)務(wù)人員提供財(cái)務(wù)的管理、計(jì)算和報(bào)表服務(wù);人事系統(tǒng)為人事部門提供全公司人員的維護(hù)服務(wù);各種業(yè)務(wù)系統(tǒng)為公司內(nèi)部不同的業(yè)務(wù)提供不同的 服務(wù)等等。這些系統(tǒng)的目的都是讓計(jì)算機(jī)來進(jìn)行復(fù)雜繁瑣的計(jì)算工作,來替代人力的手工勞動(dòng),提高工作效率和質(zhì)量。這些不同的系統(tǒng)往往是在不同的時(shí)期建設(shè)起來 的,運(yùn)行在不同的平臺(tái)上;也許是由不同廠商開發(fā),使用了各種不同的技術(shù)和標(biāo)準(zhǔn)。如果舉例說國內(nèi)一著名的IT公司(名字隱去),內(nèi)部共有60多個(gè)業(yè)務(wù)系統(tǒng),這些系統(tǒng)包括兩個(gè)不同版本的SAP的ERP系統(tǒng),12個(gè)不同類型和版本的數(shù)據(jù)庫系統(tǒng),8個(gè)不同類型和版本的操作系統(tǒng),以及使用了3種不同的防火墻技術(shù),還有數(shù)十種互相不能兼容的協(xié)議和標(biāo)準(zhǔn),你相信嗎?不要懷疑,這種情況其實(shí)非常普遍。每一個(gè)應(yīng)用系統(tǒng)在運(yùn)行了數(shù)年以后,都會(huì)成為不可替換的企業(yè)IT架構(gòu)的一部分,如下圖所示。

隨 著企業(yè)的發(fā)展,業(yè)務(wù)系統(tǒng)的數(shù)量在不斷的增加,老的系統(tǒng)卻不能輕易的替換,這會(huì)帶來很多的開銷。其一是管理上的開銷,需要維護(hù)的系統(tǒng)越來越多。很多系統(tǒng)的數(shù) 據(jù)是相互冗余和重復(fù)的,數(shù)據(jù)的不一致性會(huì)給管理工作帶來很大的壓力。業(yè)務(wù)和業(yè)務(wù)之間的相關(guān)性也越來越大,例如公司的計(jì)費(fèi)系統(tǒng)和財(cái)務(wù)系統(tǒng),財(cái)務(wù)系統(tǒng)和人事系 統(tǒng)之間都不可避免的有著密切的關(guān)系。

為了降低管理的消耗,最大限度的重用已有投資的系統(tǒng),很多企業(yè)都在進(jìn)行著企業(yè)應(yīng)用集成(EAI)。 企業(yè)應(yīng)用集成可以在不同層面上進(jìn)行:例如在數(shù)據(jù)存儲(chǔ)層面上的“數(shù)據(jù)大集中”,在傳輸層面上的“通用數(shù)據(jù)交換平臺(tái)”,在應(yīng)用層面上的“業(yè)務(wù)流程整合”,和用 戶界面上的“通用企業(yè)門戶”等等。事實(shí)上,還用一個(gè)層面上的集成變得越來越重要,那就是“身份認(rèn)證”的整合,也就是“單點(diǎn)登錄”。

通常來說,每個(gè)單獨(dú)的系統(tǒng)都會(huì)有自己的安全體系和身份認(rèn)證系統(tǒng)。整合以前,進(jìn)入每個(gè)系統(tǒng)都需要進(jìn)行登錄,這樣的局面不僅給管理上帶來了很大的困難,在安全方面也埋下了重大的隱患。下面是一些著名的調(diào)查公司顯示的統(tǒng)計(jì)數(shù)據(jù):

用戶每天平均 16 分鐘花在身份驗(yàn)證任務(wù)上 - 資料來源: IDS

頻繁的 IT 用戶平均有 21 個(gè)密碼 - 資料來源: NTA Monitor Password Survey

49% 的人寫下了其密碼,而 67% 的人很少改變它們

每 79 秒出現(xiàn)一起身份被竊事件 - 資料來源:National Small Business Travel Assoc

全球欺騙損失每年約 12B - 資料來源:Comm Fraud Control Assoc

到 2007 年,身份管理市場(chǎng)將成倍增長(zhǎng)至 $4.5B - 資料來源:IDS

使用“單點(diǎn)登錄”整合后,只需要登錄一次就可以進(jìn)入多個(gè)系統(tǒng),而不需要重新登錄,這不僅僅帶來了更好的用戶體驗(yàn),更重要的是降低了安全的風(fēng)險(xiǎn)和管理的消耗。請(qǐng)看下面的統(tǒng)計(jì)數(shù)據(jù):

提高 IT 效率:對(duì)于每 1000 個(gè)受管用戶,每用戶可節(jié)省$70K

幫助臺(tái)呼叫減少至少1/3,對(duì)于 10K 員工的公司,每年可以節(jié)省每用戶 $75,或者合計(jì) $648K

生產(chǎn)力提高:每個(gè)新員工可節(jié)省 $1K,每個(gè)老員工可節(jié)省 $350 ?資料來源:Giga

ROI 回報(bào):7.5 到 13 個(gè)月 ?資料來源:Gartner

另外,使用“單點(diǎn)登錄”還是SOA時(shí)代的需求之一。在面向服務(wù)的架構(gòu)中,服務(wù)和服務(wù)之間,程序和程序之間的通訊大量存在,服務(wù)之間的安全認(rèn)證是SOA應(yīng)用的難點(diǎn)之一,應(yīng)此建立“單點(diǎn)登錄”的系統(tǒng)體系能夠大大簡(jiǎn)化SOA的安全問題,提高服務(wù)之間的合作效率。

2 單點(diǎn)登陸的技術(shù)實(shí)現(xiàn)機(jī)制

隨著SSO技術(shù)的流行,SSO的產(chǎn)品也是滿天飛揚(yáng)。所有著名的軟件廠商都提供了相應(yīng)的解決方案。在這里我并不想介紹自己公司(Sun Microsystems)的產(chǎn)品,而是對(duì)SSO技術(shù)本身進(jìn)行解析,并且提供自己開發(fā)這一類產(chǎn)品的方法和簡(jiǎn)單演示。有關(guān)我寫這篇文章的目的,請(qǐng)參考我的博客()。

單 點(diǎn)登錄的機(jī)制其實(shí)是比較簡(jiǎn)單的,用一個(gè)現(xiàn)實(shí)中的例子做比較。頤和園是北京著名的旅游景點(diǎn),也是我常去的地方。在頤和園內(nèi)部有許多獨(dú)立的景點(diǎn),例如“蘇州 街”、“佛香閣”和“德和園”,都可以在各個(gè)景點(diǎn)門口單獨(dú)買票。很多游客需要游玩所有德景點(diǎn),這種買票方式很不方便,需要在每個(gè)景點(diǎn)門口排隊(duì)買票,錢包拿 進(jìn)拿出的,容易丟失,很不安全。于是絕大多數(shù)游客選擇在大門口買一張通票(也叫套票),就可以玩遍所有的景點(diǎn)而不需要重新再買票。他們只需要在每個(gè)景點(diǎn)門 口出示一下剛才買的套票就能夠被允許進(jìn)入每個(gè)獨(dú)立的景點(diǎn)。

單點(diǎn)登錄的機(jī)制也一樣,如下圖所示,當(dāng)用戶第一次訪問應(yīng)用系統(tǒng)1的時(shí)候,因?yàn)檫€沒有登錄,會(huì)被引導(dǎo)到認(rèn)證系統(tǒng)中進(jìn)行登錄(1);根據(jù)用戶提供的登錄信息,認(rèn)證系統(tǒng)進(jìn)行身份效驗(yàn),如果通過效驗(yàn),應(yīng)該返回給用戶一個(gè)認(rèn)證的憑據(jù)--ticket(2);用戶再訪問別的應(yīng)用的時(shí)候(3,5)就會(huì)將這個(gè)ticket帶上,作為自己認(rèn)證的憑據(jù),應(yīng)用系統(tǒng)接受到請(qǐng)求之后會(huì)把ticket送到認(rèn)證系統(tǒng)進(jìn)行效驗(yàn),檢查ticket的合法性(4,6)。如果通過效驗(yàn),用戶就可以在不用再次登錄的情況下訪問應(yīng)用系統(tǒng)2和應(yīng)用系統(tǒng)3了。

從上面的視圖可以看出,要實(shí)現(xiàn)SSO,需要以下主要的功能:

所有應(yīng)用系統(tǒng)共享一個(gè)身份認(rèn)證系統(tǒng)。

統(tǒng)一的認(rèn)證系統(tǒng)是SSO的前提之一。認(rèn)證系統(tǒng)的主要功能是將用戶的登錄信息和用戶信息庫相比較,對(duì)用戶進(jìn)行登錄認(rèn)證;認(rèn)證成功后,認(rèn)證系統(tǒng)應(yīng)該生成統(tǒng)一的認(rèn)證標(biāo)志(ticket),返還給用戶。另外,認(rèn)證系統(tǒng)還應(yīng)該對(duì)ticket進(jìn)行效驗(yàn),判斷其有效性。

所有應(yīng)用系統(tǒng)能夠識(shí)別和提取ticket信息

要實(shí)現(xiàn)SSO的功能,讓用戶只登錄一次,就必須讓應(yīng)用系統(tǒng)能夠識(shí)別已經(jīng)登錄過的用戶。應(yīng)用系統(tǒng)應(yīng)該能對(duì)ticket進(jìn)行識(shí)別和提取,通過與認(rèn)證系統(tǒng)的通訊,能自動(dòng)判斷當(dāng)前用戶是否登錄過,從而完成單點(diǎn)登錄的功能。

上面的功能只是一個(gè)非常簡(jiǎn)單的SSO架構(gòu),在現(xiàn)實(shí)情況下的SSO有著更加復(fù)雜的結(jié)構(gòu)。有兩點(diǎn)需要指出的是:

單一的用戶信息數(shù)據(jù)庫并不是必須的,有許多系統(tǒng)不能將所有的用戶信息都集中存儲(chǔ),應(yīng)該允許用戶信息放置在不同的存儲(chǔ)中,如下圖所示。事實(shí)上,只要統(tǒng)一認(rèn)證系統(tǒng),統(tǒng)一ticket的產(chǎn)生和效驗(yàn),無論用戶信息存儲(chǔ)在什么地方,都能實(shí)現(xiàn)單點(diǎn)登錄。

統(tǒng)一的認(rèn)證系統(tǒng)并不是說只有單個(gè)的認(rèn)證服務(wù)器,如下圖所示,整個(gè)系統(tǒng)可以存在兩個(gè)以上的認(rèn)證服務(wù)器,這些服務(wù)器甚至可以是不同的產(chǎn)品。認(rèn)證服務(wù)器之間要通過標(biāo)準(zhǔn)的通訊協(xié)議,互相交換認(rèn)證信息,就能完成更高級(jí)別的單點(diǎn)登錄。如下圖,當(dāng)用戶在訪問應(yīng)用系統(tǒng)1時(shí),由第一個(gè)認(rèn)證服務(wù)器進(jìn)行認(rèn)證后,得到由此服務(wù)器產(chǎn)生的ticket。當(dāng)他訪問應(yīng)用系統(tǒng)4的時(shí)候,認(rèn)證服務(wù)器2能夠識(shí)別此ticket是由第一個(gè)服務(wù)器產(chǎn)生的,通過認(rèn)證服務(wù)器之間標(biāo)準(zhǔn)的通訊協(xié)議(例如SAML)來交換認(rèn)證信息,仍然能夠完成SSO的功能。

3 WEB-SSO的實(shí)現(xiàn)

隨著互聯(lián)網(wǎng)的高速發(fā)展,WEB應(yīng)用幾乎統(tǒng)治了絕大部分的軟件應(yīng)用系統(tǒng),因此WEB-SSO是SSO應(yīng)用當(dāng)中最為流行。WEB-SSO有其自身的特點(diǎn)和優(yōu)勢(shì),實(shí)現(xiàn)起來比較簡(jiǎn)單易用。很多商業(yè)軟件和開源軟件都有對(duì)WEB-SSO的實(shí)現(xiàn)。其中值得一提的是OpenSSO (),為用Java實(shí)現(xiàn)WEB-SSO提供架構(gòu)指南和服務(wù)指南,為用戶自己來實(shí)現(xiàn)WEB-SSO提供了理論的依據(jù)和實(shí)現(xiàn)的方法。

為什么說WEB-SSO比較容易實(shí)現(xiàn)呢?這是有WEB應(yīng)用自身的特點(diǎn)決定的。

眾所周知,Web協(xié)議(也就是HTTP)是一個(gè)無狀態(tài)的協(xié)議。一個(gè)Web應(yīng)用由很多個(gè)Web頁面組成,每個(gè)頁面都有唯一的URL來定義。用戶在瀏覽器的地址欄輸入頁面的URL,瀏覽器就會(huì)向Web Server去發(fā)送請(qǐng)求。如下圖,瀏覽器向Web服務(wù)器發(fā)送了兩個(gè)請(qǐng)求,申請(qǐng)了兩個(gè)頁面。這兩個(gè)頁面的請(qǐng)求是分別使用了兩個(gè)單獨(dú)的HTTP連接。所謂無狀態(tài)的協(xié)議也就是表現(xiàn)在這里,瀏覽器和Web服務(wù)器會(huì)在第一個(gè)請(qǐng)求完成以后關(guān)閉連接通道,在第二個(gè)請(qǐng)求的時(shí)候重新建立連接。Web服務(wù)器并不區(qū)分哪個(gè)請(qǐng)求來自哪個(gè)客戶端,對(duì)所有的請(qǐng)求都一視同仁,都是單獨(dú)的連接。這樣的方式大大區(qū)別于傳統(tǒng)的(Client/Server)C/S結(jié)構(gòu),在那樣的應(yīng)用中,客戶端和服務(wù)器端會(huì)建立一個(gè)長(zhǎng)時(shí)間的專用的連接通道。正是因?yàn)橛辛藷o狀態(tài)的特性,每個(gè)連接資源能夠很快被其他客戶端所重用,一臺(tái)Web服務(wù)器才能夠同時(shí)服務(wù)于成千上萬的客戶端。

但是我們通常的應(yīng)用是有狀態(tài)的。先不用提不同應(yīng)用之間的SSO,在同一個(gè)應(yīng)用中也需要保存用戶的登錄身份信息。例如用戶在訪問頁面1的時(shí)候進(jìn)行了登錄,但是剛才也提到,客戶端的每個(gè)請(qǐng)求都是單獨(dú)的連接,當(dāng)客戶再次訪問頁面2的時(shí)候,如何才能告訴Web服務(wù)器,客戶剛才已經(jīng)登錄過了呢?瀏覽器和服務(wù)器之間有約定:通過使用cookie技術(shù)來維護(hù)應(yīng)用的狀態(tài)。Cookie是可以被Web服務(wù)器設(shè)置的字符串,并且可以保存在瀏覽器中。如下圖所示,當(dāng)瀏覽器訪問了頁面1時(shí),web服務(wù)器設(shè)置了一個(gè)cookie,并將這個(gè)cookie和頁面1一起返回給瀏覽器,瀏覽器接到cookie之后,就會(huì)保存起來,在它訪問頁面2的時(shí)候會(huì)把這個(gè)cookie也帶上,Web服務(wù)器接到請(qǐng)求時(shí)也能讀出cookie的值,根據(jù)cookie值的內(nèi)容就可以判斷和恢復(fù)一些用戶的信息狀態(tài)。

Web-SSO完全可以利用Cookie結(jié)束來完成用戶登錄信息的保存,將瀏覽器中的Cookie和上文中的Ticket結(jié)合起來,完成SSO的功能。

為了完成一個(gè)簡(jiǎn)單的SSO的功能,需要兩個(gè)部分的合作:

統(tǒng)一的身份認(rèn)證服務(wù)。

修改Web應(yīng)用,使得每個(gè)應(yīng)用都通過這個(gè)統(tǒng)一的認(rèn)證服務(wù)來進(jìn)行身份效驗(yàn)。

3.1 Web SSO 的樣例

根據(jù)上面的原理,我用J2EE的技術(shù)(JSP和Servlet)完成了一個(gè)具有Web-SSO的簡(jiǎn)單樣例。樣例包含一個(gè)身份認(rèn)證的服務(wù)器和兩個(gè)簡(jiǎn)單的Web應(yīng)用,使得這兩個(gè) Web應(yīng)用通過統(tǒng)一的身份認(rèn)證服務(wù)來完成Web-SSO的功能。此樣例所有的源代碼和二進(jìn)制代碼都可以從網(wǎng)站地址 下載。

樣例下載、安裝部署和運(yùn)行指南:

Web-SSO的樣例是由三個(gè)標(biāo)準(zhǔn)Web應(yīng)用組成,壓縮成三個(gè)zip文件,從中下載。其中SSOAuth()是身份認(rèn)證服務(wù);SSOWebDemo1()和SSOWebDemo2()是兩個(gè)用來演示單點(diǎn)登錄的Web應(yīng)用。這三個(gè)Web應(yīng)用之所以沒有打成war包,是因?yàn)樗鼈儾荒苤苯硬渴?,根?jù)讀者的部署環(huán)境需要作出小小的修改。樣例部署和運(yùn)行的環(huán)境有一定的要求,需要符合Servlet2.3以上標(biāo)準(zhǔn)的J2EE容器才能運(yùn)行(例如Tomcat5,Sun Application Server 8, Jboss 4等)。另外,身份認(rèn)證服務(wù)需要JDK1.5的運(yùn)行環(huán)境。之所以要用JDK1.5是因?yàn)楣P者使用了一個(gè)線程安全的高性能的Java集合類“ConcurrentMap”,只有在JDK1.5中才有。

這三個(gè)Web應(yīng)用完全可以單獨(dú)部署,它們可以分別部署在不同的機(jī)器,不同的操作系統(tǒng)和不同的J2EE的產(chǎn)品上,它們完全是標(biāo)準(zhǔn)的和平臺(tái)無關(guān)的應(yīng)用。但是有一個(gè)限制,那兩臺(tái)部署應(yīng)用(demo1、demo2)的機(jī)器的域名需要相同,這在后面的章節(jié)中會(huì)解釋到cookie和domain的關(guān)系以及如何制作跨域的WEB-SSO

解壓縮SSOAuth.zip文件,在/WEB-INF/下的web.xml中請(qǐng)修改“domainname”的屬性以反映實(shí)際的應(yīng)用部署情況,domainname需要設(shè)置為兩個(gè)單點(diǎn)登錄的應(yīng)用(demo1和demo2)所屬的域名。這個(gè)domainname和當(dāng)前SSOAuth服務(wù)部署的機(jī)器的域名沒有關(guān)系。我缺省設(shè)置的是“.sun.com”。如果你部署demo1和demo2的機(jī)器沒有域名,請(qǐng)輸入IP地址或主機(jī)名(如localhost),但是如果使用IP地址或主機(jī)名也就意味著demo1和demo2需要部署到一臺(tái)機(jī)器上了。設(shè)置完后,根據(jù)你所選擇的J2EE容器,可能需要將SSOAuth這個(gè)目錄壓縮打包成war文件。用“jar -cvf SSOAuth.war SSOAuth/”就可以完成這個(gè)功能。

解壓縮SSOWebDemo1和SSOWebDemo2文件,分別在它們/WEB-INF/下找到web.xml文件,請(qǐng)修改其中的幾個(gè)初始化參數(shù)

init-param

param-nameSSOServiceURL/param-name

param-value;/param-value

/init-param

init-param

param-nameSSOLoginPage/param-name

param-value;/param-value

/init-param

將其中的SSOServiceURL和SSOLoginPage修改成部署SSOAuth應(yīng)用的機(jī)器名、端口號(hào)以及根路徑(缺省是SSOAuth)以反映實(shí)際的部署情況。設(shè)置完后,根據(jù)你所選擇的J2EE容器,可能需要將SSOWebDemo1和SSOWebDemo2這兩個(gè)目錄壓縮打包成兩個(gè)war文件。用“jar -cvf SSOWebDemo1.war SSOWebDemo1/”就可以完成這個(gè)功能。

請(qǐng)輸入第一個(gè)web應(yīng)用的測(cè)試URL(test.jsp),例如 SSOWebDemo1/test.jsp,如果是第一次訪問,便會(huì)自動(dòng)跳轉(zhuǎn)到登錄界面,如下圖

使用系統(tǒng)自帶的三個(gè)帳號(hào)之一登錄(例如,用戶名:wangyu,密碼:wangyu),便能成功的看到test.jsp的內(nèi)容:顯示當(dāng)前用戶名和歡迎信息。

請(qǐng)接著在同一個(gè)瀏覽器中輸入第二個(gè)web應(yīng)用的測(cè)試URL(test.jsp),例如 SSOWebDemo2/test.jsp。你會(huì)發(fā)現(xiàn),不需要再次登錄就能看到test.jsp的內(nèi)容,同樣是顯示當(dāng)前用戶名和歡迎信息,而且歡迎信息中明確的顯示當(dāng)前的應(yīng)用名稱(demo2)。

3.2 WEB-SSO代碼講解

3.2.1身份認(rèn)證服務(wù)代碼解析

Web-SSO的源代碼可以從網(wǎng)站地址下載。身份認(rèn)證服務(wù)是一個(gè)標(biāo)準(zhǔn)的web應(yīng)用,包括一個(gè)名為SSOAuth的Servlet,一個(gè)login.jsp文件和一個(gè)failed.html。身份認(rèn)證的所有服務(wù)幾乎都由SSOAuth的Servlet來實(shí)現(xiàn)了;login.jsp用來顯示登錄的頁面(如果發(fā)現(xiàn)用戶還沒有登錄過);failed.html是用來顯示登錄失敗的信息(如果用戶的用戶名和密碼與信息數(shù)據(jù)庫中的不一樣)。

SSOAuth的代碼如下面的列表顯示,結(jié)構(gòu)非常簡(jiǎn)單,先看看這個(gè)Servlet的主體部分:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

package DesktopSSO;

import java.io.*;

import java.net.*;

import java.text.*;

import java.util.*;

import java.util.concurrent.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class SSOAuth extends HttpServlet {

static private ConcurrentMap accounts;

static private ConcurrentMap SSOIDs;

String cookiename="WangYuDesktopSSOID";

String domainname;

public void init(ServletConfig config) throws ServletException {

super.init(config);

domainname= config.getInitParameter("domainname");

cookiename = config.getInitParameter("cookiename");

SSOIDs = new ConcurrentHashMap();

accounts=new ConcurrentHashMap();

accounts.put("wangyu", "wangyu");

accounts.put("paul", "paul");

accounts.put("carol", "carol");

}

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

PrintWriter out = response.getWriter();

String action = request.getParameter("action");

String result="failed";

if (action==null) {

handlerFromLogin(request,response);

} else if (action.equals("authcookie")){

String myCookie = request.getParameter("cookiename");

if (myCookie != null) result = authCookie(myCookie);

out.print(result);

out.close();

} else if (action.equals("authuser")) {

result=authNameAndPasswd(request,response);

out.print(result);

out.close();

} else if (action.equals("logout")) {

String myCookie = request.getParameter("cookiename");

logout(myCookie);

out.close();

}

}

.....

}

從代碼很容易看出,SSOAuth就是一個(gè)簡(jiǎn)單的Servlet。其中有兩個(gè)靜態(tài)成員變量:accounts和SSOIDs,這兩個(gè)成員變量都使用了JDK1.5中線程安全的MAP類: ConcurrentMap,所以這個(gè)樣例一定要JDK1.5才能運(yùn)行。Accounts用來存放用戶的用戶名和密碼,在init()的方法中可以看到我給系統(tǒng)添加了三個(gè)合法的用戶。在實(shí)際應(yīng)用中,accounts應(yīng)該是去數(shù)據(jù)庫中或LDAP中獲得,為了簡(jiǎn)單起見,在本樣例中我使用了ConcurrentMap在內(nèi)存中用程序創(chuàng)建了三個(gè)用戶。而SSOIDs保存了在用戶成功的登錄后所產(chǎn)生的cookie和用戶名的對(duì)應(yīng)關(guān)系。它的功能顯而易見:當(dāng)用戶成功登錄以后,再次訪問別的系統(tǒng),為了鑒別這個(gè)用戶請(qǐng)求所帶的cookie的有效性,需要到SSOIDs中檢查這樣的映射關(guān)系是否存在。

在主要的請(qǐng)求處理方法processRequest()中,可以很清楚的看到SSOAuth的所有功能

如果用戶還沒有登錄過,是第一次登錄本系統(tǒng),會(huì)被跳轉(zhuǎn)到login.jsp頁面(在后面會(huì)解釋如何跳轉(zhuǎn))。用戶在提供了用戶名和密碼以后,就會(huì)用handlerFromLogin()這個(gè)方法來驗(yàn)證。

如果用戶已經(jīng)登錄過本系統(tǒng),再訪問別的應(yīng)用的時(shí)候,是不需要再次登錄的。因?yàn)闉g覽器會(huì)將第一次登錄時(shí)產(chǎn)生的cookie和請(qǐng)求一起發(fā)送。效驗(yàn)cookie的有效性是SSOAuth的主要功能之一。

SSOAuth還能直接效驗(yàn)非login.jsp頁面過來的用戶名和密碼的效驗(yàn)請(qǐng)求。這個(gè)功能是用于非web應(yīng)用的SSO,這在后面的桌面SSO中會(huì)用到。

SSOAuth還提供logout服務(wù)。

單點(diǎn)登錄,java實(shí)現(xiàn)

可以直接通過玉符科技IDAAS平臺(tái)來實(shí)現(xiàn)單點(diǎn)登錄,支持所有的標(biāo)準(zhǔn)協(xié)議,如果是老舊或者自研的系統(tǒng),也有SDK去適配所有的開發(fā)語言,不止是java。

玉符單點(diǎn)登錄

如何用java實(shí)現(xiàn)單點(diǎn)登錄,最好能有代碼

單點(diǎn)登陸的話,你可以使用token來實(shí)現(xiàn),比如一個(gè)用戶一次只生成一個(gè)token,這樣別人在訪問的時(shí)候,就會(huì)重新生成一個(gè),之前的就會(huì)被踢出線

java web應(yīng)用如何實(shí)現(xiàn)單點(diǎn)登錄

實(shí)現(xiàn)方式一:父域 Cookie

實(shí)現(xiàn)方式二:認(rèn)證中心

實(shí)現(xiàn)方式三:LocalStorage?跨域

補(bǔ)充:域名分級(jí)

在 B/S 系統(tǒng)中,登錄功能通常都是基于 Cookie 來實(shí)現(xiàn)的。當(dāng)用戶登錄成功后,一般會(huì)將登錄狀態(tài)記錄到 Session 中,或者是給用戶簽發(fā)一個(gè) Token,無論哪一種方式,都需要在客戶端保存一些信息(Session ID 或 Token ),并要求客戶端在之后的每次請(qǐng)求中攜帶它們。在這樣的場(chǎng)景下,使用 Cookie 無疑是最方便的,因此我們一般都會(huì)將 Session 的 ID 或 Token 保存到 Cookie 中,當(dāng)服務(wù)端收到請(qǐng)求后,通過驗(yàn)證 Cookie 中的信息來判斷用戶是否登錄 。

單點(diǎn)登錄(Single Sign On, SSO)是指在同一帳號(hào)平臺(tái)下的多個(gè)應(yīng)用系統(tǒng)中,用戶只需登錄一次,即可訪問所有相互信任的應(yīng)用系統(tǒng)。舉例來說,百度貼吧和百度地圖是百度公司旗下的兩個(gè)不同的應(yīng)用系統(tǒng),如果用戶在百度貼吧登錄過之后,當(dāng)他訪問百度地圖時(shí)無需再次登錄,那么就說明百度貼吧和百度地圖之間實(shí)現(xiàn)了單點(diǎn)登錄。

單點(diǎn)登錄的本質(zhì)就是在多個(gè)應(yīng)用系統(tǒng)中共享登錄狀態(tài)。如果用戶的登錄狀態(tài)是記錄在 Session 中的,要實(shí)現(xiàn)共享登錄狀態(tài),就要先共享 Session,比如可以將 Session 序列化到 Redis 中,讓多個(gè)應(yīng)用系統(tǒng)共享同一個(gè) Redis,直接讀取 Redis 來獲取 Session。

當(dāng)然僅此是不夠的,因?yàn)椴煌膽?yīng)用系統(tǒng)有著不同的域名,盡管 Session 共享了,但是由于 Session ID 是往往保存在瀏覽器 Cookie 中的,因此存在作用域的限制,無法跨域名傳遞,也就是說當(dāng)用戶在 app1.com 中登錄后,Session ID 僅在瀏覽器訪問 app1.com 時(shí)才會(huì)自動(dòng)在請(qǐng)求頭中攜帶,而當(dāng)瀏覽器訪問 app2.com 時(shí),Session ID 是不會(huì)被帶過去的。實(shí)現(xiàn)單點(diǎn)登錄的關(guān)鍵在于,如何讓 Session ID(或 Token)在多個(gè)域中共享。

實(shí)現(xiàn)方式一:父域 Cookie

在將具體實(shí)現(xiàn)之前,我們先來聊一聊 Cookie 的作用域。

Cookie 的作用域由 domain 屬性和 path 屬性共同決定。domain 屬性的有效值為當(dāng)前域或其父域的域名/IP地址,在 Tomcat 中,domain 屬性默認(rèn)為當(dāng)前域的域名/IP地址。path 屬性的有效值是以“/”開頭的路徑,在 Tomcat 中,path 屬性默認(rèn)為當(dāng)前 Web 應(yīng)用的上下文路徑。

如果將 Cookie 的 domain 屬性設(shè)置為當(dāng)前域的父域,那么就認(rèn)為它是父域 Cookie。Cookie 有一個(gè)特點(diǎn),即父域中的 Cookie 被子域所共享,換言之,子域會(huì)自動(dòng)繼承父域中的Cookie。

利用 Cookie 的這個(gè)特點(diǎn),不難想到,將 Session ID(或 Token)保存到父域中不就行了。沒錯(cuò),我們只需要將 Cookie 的 domain 屬性設(shè)置為父域的域名(主域名),同時(shí)將 Cookie 的 path 屬性設(shè)置為根路徑,這樣所有的子域應(yīng)用就都可以訪問到這個(gè) Cookie 了。不過這要求應(yīng)用系統(tǒng)的域名需建立在一個(gè)共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它們都建立在 baidu.com 這個(gè)主域名之下,那么它們就可以通過這種方式來實(shí)現(xiàn)單點(diǎn)登錄。

總結(jié):此種實(shí)現(xiàn)方式比較簡(jiǎn)單,但不支持跨主域名。

實(shí)現(xiàn)方式二:認(rèn)證中心

我們可以部署一個(gè)認(rèn)證中心,認(rèn)證中心就是一個(gè)專門負(fù)責(zé)處理登錄請(qǐng)求的獨(dú)立的 Web 服務(wù)。

用戶統(tǒng)一在認(rèn)證中心進(jìn)行登錄,登錄成功后,認(rèn)證中心記錄用戶的登錄狀態(tài),并將 Token 寫入 Cookie。(注意這個(gè) Cookie 是認(rèn)證中心的,應(yīng)用系統(tǒng)是訪問不到的。)

應(yīng)用系統(tǒng)檢查當(dāng)前請(qǐng)求有沒有 Token,如果沒有,說明用戶在當(dāng)前系統(tǒng)中尚未登錄,那么就將頁面跳轉(zhuǎn)至認(rèn)證中心。由于這個(gè)操作會(huì)將認(rèn)證中心的 Cookie 自動(dòng)帶過去,因此,認(rèn)證中心能夠根據(jù) Cookie 知道用戶是否已經(jīng)登錄過了。如果認(rèn)證中心發(fā)現(xiàn)用戶尚未登錄,則返回登錄頁面,等待用戶登錄,如果發(fā)現(xiàn)用戶已經(jīng)登錄過了,就不會(huì)讓用戶再次登錄了,而是會(huì)跳轉(zhuǎn)回目標(biāo) URL ,并在跳轉(zhuǎn)前生成一個(gè) Token,拼接在目標(biāo) URL 的后面,回傳給目標(biāo)應(yīng)用系統(tǒng)。

應(yīng)用系統(tǒng)拿到 Token 之后,還需要向認(rèn)證中心確認(rèn)下 Token 的合法性,防止用戶偽造。確認(rèn)無誤后,應(yīng)用系統(tǒng)記錄用戶的登錄狀態(tài),并將 Token 寫入 Cookie,然后給本次訪問放行。(注意這個(gè) Cookie 是當(dāng)前應(yīng)用系統(tǒng)的,其他應(yīng)用系統(tǒng)是訪問不到的。)當(dāng)用戶再次訪問當(dāng)前應(yīng)用系統(tǒng)時(shí),就會(huì)自動(dòng)帶上這個(gè) Token,應(yīng)用系統(tǒng)驗(yàn)證 Token 發(fā)現(xiàn)用戶已登錄,于是就不會(huì)有認(rèn)證中心什么事了。

這里順便介紹兩款認(rèn)證中心的開源實(shí)現(xiàn):

Apereo CAS 是一個(gè)企業(yè)級(jí)單點(diǎn)登錄系統(tǒng),其中 CAS 的意思是”Central Authentication Service“。它最初是耶魯大學(xué)實(shí)驗(yàn)室的項(xiàng)目,后來轉(zhuǎn)讓給了 JASIG 組織,項(xiàng)目更名為 JASIG CAS,后來該組織并入了Apereo 基金會(huì),項(xiàng)目也隨之更名為 Apereo CAS。

XXL-SSO 是一個(gè)簡(jiǎn)易的單點(diǎn)登錄系統(tǒng),由大眾點(diǎn)評(píng)工程師許雪里個(gè)人開發(fā),代碼比較簡(jiǎn)單,沒有做安全控制,因而不推薦直接應(yīng)用在項(xiàng)目中,這里列出來僅供參考。

總結(jié):此種實(shí)現(xiàn)方式相對(duì)復(fù)雜,支持跨域,擴(kuò)展性好,是單點(diǎn)登錄的標(biāo)準(zhǔn)做法。

實(shí)現(xiàn)方式三:LocalStorage 跨域

前面,我們說實(shí)現(xiàn)單點(diǎn)登錄的關(guān)鍵在于,如何讓 Session ID(或 Token)在多個(gè)域中共享。

父域 Cookie 確實(shí)是一種不錯(cuò)的解決方案,但是不支持跨域。那么有沒有什么奇淫技巧能夠讓 Cookie 跨域傳遞呢?

很遺憾,瀏覽器對(duì) Cookie 的跨域限制越來越嚴(yán)格。Chrome 瀏覽器還給 Cookie 新增了一個(gè) SameSite 屬性,此舉幾乎禁止了一切跨域請(qǐng)求的 Cookie 傳遞(超鏈接除外),并且只有當(dāng)使用 HTTPs 協(xié)議時(shí),才有可能被允許在 AJAX 跨域請(qǐng)求中接受服務(wù)器傳來的 Cookie。

不過,在前后端分離的情況下,完全可以不使用 Cookie,我們可以選擇將 Session ID (或 Token )保存到瀏覽器的 LocalStorage 中,讓前端在每次向后端發(fā)送請(qǐng)求時(shí),主動(dòng)將 LocalStorage 的數(shù)據(jù)傳遞給服務(wù)端。這些都是由前端來控制的,后端需要做的僅僅是在用戶登錄成功后,將 Session ID (或 Token )放在響應(yīng)體中傳遞給前端。

在這樣的場(chǎng)景下,單點(diǎn)登錄完全可以在前端實(shí)現(xiàn)。前端拿到 Session ID (或 Token )后,除了將它寫入自己的 LocalStorage 中之外,還可以通過特殊手段將它寫入多個(gè)其他域下的 LocalStorage 中。

————————————————

版權(quán)聲明:本文為CSDN博主「風(fēng)水道人」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:

前端通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個(gè)域下的 LocalStorage 中,前端每次在向后端發(fā)送請(qǐng)求之前,都會(huì)主動(dòng)從 LocalStorage 中讀取 Token 并在請(qǐng)求中攜帶,這樣就實(shí)現(xiàn)了同一份 Token 被多個(gè)域所共享。

總結(jié):此種實(shí)現(xiàn)方式完全由前端控制,幾乎不需要后端參與,同樣支持跨域。

補(bǔ)充:域名分級(jí)

從專業(yè)的角度來說(根據(jù)《計(jì)算機(jī)網(wǎng)絡(luò)》中的定義),.com、.cn 為一級(jí)域名(也稱頂級(jí)域名),.com.cn、baidu.com 為二級(jí)域名,sina.com.cn、tieba.baidu.com 為三級(jí)域名,以此類推,N 級(jí)域名就是 N-1 級(jí)域名的直接子域名。

從使用者的角度來說,一般把可支持獨(dú)立備案的主域名稱作一級(jí)域名,如 baidu.com、sina.com.cn 皆可稱作一級(jí)域名,在主域名下建立的直接子域名稱作二級(jí)域名,如 tieba.baidu.com 為二級(jí)域名。

關(guān)于javaWeb單點(diǎn)登錄

描述:在A系統(tǒng)登錄后,點(diǎn)擊A系統(tǒng)的某個(gè)模塊,登錄到B系統(tǒng)。

解決思路:在B系統(tǒng)的后臺(tái)代碼獲取B系統(tǒng)的用戶名和密碼,當(dāng)點(diǎn)擊A系統(tǒng)的某個(gè)模塊時(shí)將用戶名和密碼通過url登錄到B系統(tǒng)。?描述:點(diǎn)擊A系統(tǒng)的退出按鈕,同時(shí)退出B系統(tǒng);

解決思路: ?在A系統(tǒng)的帶有退出按鈕的jsp頁面,找到退出方法,將退出成功后執(zhí)行的方法改為退出B系統(tǒng)。?描述:找到B系統(tǒng)的登錄界面,通過js,執(zhí)行頁面加載完畢后執(zhí)行

解決方案:Window.onload=function 在執(zhí)行方法中執(zhí)行A系統(tǒng)的登錄接口,即可完成單點(diǎn)退出。

總結(jié):A和B是兩個(gè)工程,那就讓A和B一個(gè)做客戶端,一個(gè)做服務(wù)端,服務(wù)端可以把服務(wù)發(fā)布出來,客戶端進(jìn)行調(diào)用,就可以了啊,分布式開發(fā)。


當(dāng)前文章:java版的單點(diǎn)登錄代碼 單點(diǎn)登錄 java
網(wǎng)頁URL:http://weahome.cn/article/hgshss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部