日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Tomcat認(rèn)證授權(quán)與簡(jiǎn)單的SSO

回顧

成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,App定制開發(fā)以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。成都創(chuàng)新互聯(lián)公司深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

在前幾天,我使用apache+tomcat搭建了一個(gè)集群,有一個(gè)簡(jiǎn)單的網(wǎng)站應(yīng)用。http://my.oschina.net/xpbug/blog/197680。

今天在此基礎(chǔ)上,我要為其開發(fā)一個(gè)登錄頁面,并開啟網(wǎng)站的認(rèn)證和授權(quán)。

基本概念

在動(dòng)手之前,我需要先了解網(wǎng)站認(rèn)證和授權(quán)的幾個(gè)基本組成部分的概念。是什么構(gòu)成了網(wǎng)站應(yīng)用的認(rèn)證和授權(quán)?

  1. Realm - 翻譯過來叫做“域”。Realm是web容器所持有的用戶集合。無論tomcat, glassfish,jboss還是websphere,均是符合j2ee規(guī)范或最佳實(shí)現(xiàn)。Realm是需要網(wǎng)站系統(tǒng)管理員進(jìn)行配置的。常見的Realm 有三種:數(shù)據(jù)庫,LDAP和文件系統(tǒng)。數(shù)據(jù)庫realm是指用戶信息都存在數(shù)據(jù)庫中,Ldap則存放在ldap中,文件系統(tǒng)的realm則是用戶信息按照 一定的格式,存放于文件中。Realm是認(rèn)證的關(guān)鍵,web容器會(huì)將用戶輸入的用戶名和密碼跟realm中的用戶信息進(jìn)行比對(duì)。當(dāng)比對(duì)成功的時(shí)候,認(rèn)證也 就成功了。
  2. Role - 角色。 這是授權(quán)的部分。當(dāng)Realm被配好以后,系統(tǒng)管理員可以為realm中的用戶分配角色。建立用戶role-mapping. 每次用戶通過web容器的認(rèn)證以后,web容器會(huì)將其role信息也查詢出來,放入用戶信息中。
  3. security-constraint。 這是web應(yīng)用web.xml中的配置。 一個(gè)web應(yīng)用將在web.xml中聲明其受保護(hù)的資源,并聲明某種角色可以訪問受保護(hù)的資源。
  4. 認(rèn)證方式。 一般認(rèn)證方式分為Basic Authentication(BA)和Form-based Authentication(FBA)。
  5. 密碼加密。一旦黑客黑了服務(wù)器,明文密碼就會(huì)全部暴露了。所以,需要對(duì)密碼進(jìn)行加密存放。一般使用MD5 SHA算法對(duì)密碼進(jìn)行加密。

以上1,2,5是由網(wǎng)站管理員來配置開發(fā)。3,4是由網(wǎng)站開發(fā)人員來配置和開發(fā)的。

本實(shí)驗(yàn)簡(jiǎn)介

在前篇實(shí)驗(yàn)結(jié)果的基礎(chǔ)上,為網(wǎng)站開啟ldap認(rèn)證,并制作一個(gè)login頁面。實(shí)驗(yàn)所用的ldap軟件為開源的openLDAP for windows版本。

OpenLDAP安裝配置

  1. 下載并安裝軟件 http://sourceforge.net/projects/openldapwindows/ OpenLDAP會(huì)被安裝成windows service.
  2. 修改slapd.conf,聲明自己的后綴和管理員. 重啟service.
 
 
  1. database    bdb 
  2. suffix      "dc=mycompany,dc=com" 
  3. rootdn      "cn=admin,dc=mycompany,dc=com" 
  4. rootpw    admin
  1. 創(chuàng)建my.ldif文件,借用tomcat文檔中的案例,文件內(nèi)容如下。其中定義了兩個(gè)用戶,和兩個(gè)角色。
 
 
  1. # Define top-level entry 
  2. dn: dc=mycompany,dc=com 
  3. objectClass: dcObject 
  4. objectClass: organization 
  5. o: mycompany 
  6. dc:mycompany 
  7.  
  8. # Define an entry to contain people 
  9. # searches for users are based on this entry 
  10. dn: ou=people,dc=mycompany,dc=com 
  11. objectClass: organizationalUnit 
  12. ou: people 
  13.  
  14. # Define a user entry 
  15. dn: uid=jjones,ou=people,dc=mycompany,dc=com 
  16. objectClass: inetOrgPerson 
  17. uid: jjones 
  18. sn: jones 
  19. cn: janet jones 
  20. mail: j.jones@mycompany.com 
  21. userPassword: janet 
  22.  
  23. # Define a user entry for Fred Bloggs 
  24. dn: uid=fbloggs,ou=people,dc=mycompany,dc=com 
  25. objectClass: inetOrgPerson 
  26. uid: fbloggs 
  27. sn: bloggs 
  28. cn: fred bloggs 
  29. mail: f.bloggs@mycompany.com 
  30. userPassword: fred 
  31.  
  32. # Define an entry to contain LDAP groups 
  33. # searches for roles are based on this entry 
  34. dn: ou=groups,dc=mycompany,dc=com 
  35. objectClass: organizationalUnit 
  36. ou: groups 
  37.  
  38. # Define an entry for the "red" role 
  39. dn: cn=red,ou=groups,dc=mycompany,dc=com 
  40. objectClass: groupOfUniqueNames 
  41. cn: red 
  42. uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com 
  43. uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com 
  44.  
  45. # Define an entry for the "black" role 
  46. dn: cn=black,ou=groups,dc=mycompany,dc=com 
  47. objectClass: groupOfUniqueNames 
  48. cn: black 
  49. uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com 
  1. 運(yùn)行命令 slapadd.exe -l my.ldif

  2. 驗(yàn)證條目添加成功,運(yùn)行查詢命令 ldapsearch.exe -x -b "dc=mycompany,dc=com" "objectClass=*"

OpenLDAP安裝配置成功,我有了下面兩個(gè)用戶:

  • uid\group
  • red
  • black
  • jjones
  • Y
  • Y
  • fbloggs
  •  
  • Y

#p#

為Tomcat配置Realm

tomcat的realm可以配置在server.xml中的, 下面。分別表示realm的作用范圍。我抱著從簡(jiǎn)的態(tài)度,將realm配置 在下面,這樣,整個(gè)tomcat上的application都可以使用此realm. 在server.xml的下面替換老的realm,添加如下代碼:

 
 
  1.  
  2.     connectionName="cn=admin,dc=mycompany,dc=com" 
  3.     connectionPassword="admin" 
  4.      connectionURL="ldap://localhost:389" 
  5.       userPassword="userPassword" 
  6.        userPattern="uid={0},ou=people,dc=mycompany,dc=com" 
  7.         
  8.           roleBase="ou=groups,dc=mycompany,dc=com" 
  9.           roleName="cn" 
  10.         roleSearch="(uniqueMember={0})" 
  11. /> 

重啟tomcat集群。

為Web應(yīng)用配置Basic Authentication

我要為https://www.test0.com/sessiontest/successful.jsp配置BA,只有role=red才可以訪問此頁面。

修改web應(yīng)用的web.xml,添加如下代碼:

 
 
  1.  
  2.    
  3.     result 
  4.     /successful.jsp 
  5.    
  6.    
  7.     red 
  8.    
  9.  
  10.   
  11.     BASIC  
  12.     tomcat  
  13.  
  14.  
  15.   red 
  16.  
  17.  
  18.   black 
  19.  

然后重新打包部署sessiontest.war. 對(duì)網(wǎng)站進(jìn)行測(cè)試,select.jsp是可以任意訪問的,當(dāng)點(diǎn)擊submit以后,必須對(duì)瀏覽器彈出的BA認(rèn)證框輸入用戶名和密碼才能post成功。

為Web應(yīng)用配置Form-based Authentication

這次,我們要設(shè)計(jì)一個(gè)登錄頁面。用戶可以隨意瀏覽購物車,選擇想要的東西,但當(dāng)用戶點(diǎn)擊submit的時(shí)候,我們需要用戶必須登錄,才能提交訂單。所以,我們需要對(duì)頁面https://www.test0.com/sessiontest/successful.jsp進(jìn)行FBA保護(hù)。

首先設(shè)計(jì)一個(gè)登錄頁面login.html

 
 
  1.  
  2.     Username 
  3.     Password 
  4.      
  5.  

注意form中的action已經(jīng)user和password的input的name屬 性,“j_security_check","j_username"和"j_password"這些事固定的,嚴(yán)格遵循J2EE規(guī)范。將 login.html放入select.jsp同級(jí)目錄下。

關(guān)于logout,我就不做設(shè)計(jì)了,很簡(jiǎn)單,只需要執(zhí)行session.invalidate(),然后跳轉(zhuǎn)到登出頁面即可。

接下來,我們修改web.xml,配置FBA. 這里只需要替換之前BA中的的

 
 
  1.   
  2.     FORM  
  3.      
  4.         /login.html 
  5.         /login.html 
  6.      
  7.  

將web應(yīng)用重新打包部署。重啟tomcat。

注意:使用mod_proxy_balancer +mod_ajp+ AJP的方式連接tomcat,存在著一個(gè)未知錯(cuò)誤。當(dāng)用戶沒有登錄,訪問被保護(hù)資源的時(shí)候,按照常理,瀏覽器會(huì)顯示我們配置好的login form。但AJP和tomcat之間的通信會(huì)在此斷掉。這可能是windows版本的問題,也可能是mod_ajp和tomcat存在缺陷。總之,花了 一天的時(shí)間,也沒研究出成果。google上面類似的問題挺多,可惜都沒答案。我會(huì)開啟tomcat的log再仔細(xì)研究到底發(fā)生了什么。

根據(jù)以往老版本,大部分使用mod_jk+ajp的方式行的通,有時(shí)間的同學(xué)可以嘗試mod_jk.

mod_ajp+ajp的方式只是卡在了FBA上,其它的任何資源訪問,都沒問題,為了讓FBA工作起來,不得已,我將balancer修改成了http模式。

 
 
  1.  
  2.       BalancerMember http://127.0.0.1:8080 loadfactor=1 route=node1 
  3.       BalancerMember http://127.0.0.1:8081 loadfactor=1 route=node2 
  4.       ProxySet stickysession=JSESSIONID 
  5.       ProxySet lbmethod=byrequests 
  6.     

此外,還有一個(gè)陷阱。tomcat在做完j_security_check以后,會(huì)重定向到http,無論之前是https. 當(dāng)然我們可以通過配置server.xml和web.xml使其重定向到Https,但一般不推薦這樣做,因?yàn)檫@很可能導(dǎo)致循環(huán)重定向。

一般的做法是在web中添加一個(gè)filter,專門負(fù)責(zé)http和https的切換。又或者在apache中配置重定向。在http-vhosts.conf中添加:

 
 
  1.  
  2.    ServerAdmin joey 
  3.    ServerName www.test0.com 
  4.    ErrorLog "logs/errlog" 
  5.    CustomLog "logs/accesslog" common 
  6.    RewriteEngine on 
  7.    RewriteRule ^/?sessiontest/(.*) https://%{SERVER_NAME}/sessiontest/$1 [R,L] 
  8.  

到此,網(wǎng)站可以在FBA的模式下正常運(yùn)行了。

#p#

FBA的缺陷

在J2EE的規(guī)范中,F(xiàn)BA存在著很大的缺陷。列舉如下:

  1. login的過程無法被干預(yù)。我們無法通過添加filter的形式進(jìn)行干預(yù)。login完全交給web容器處理,頁面也是有web容器負(fù)責(zé)展示。

  2. 沒有l(wèi)ogin地址,用戶無法bookmark一個(gè)Login頁面。直接訪問login.html是無法提交form的。login只能在訪問受保護(hù)資源的時(shí)候才會(huì)被觸發(fā)。

很不幸的是,tomcat完全遵循了J2EE關(guān)于FBA的規(guī)范,這使得FBA很不實(shí)用。 WebSphere Application Server則對(duì)規(guī)范進(jìn)行了變通,使得以上2個(gè)缺陷都被除去了。 Jboss, Glassfish和weblogic則不是很清楚,需要了解的同學(xué)可以去查看其文檔。

Tomcat build-in SSO

Tomcat本身集成SSO(Single Sign On)解決方案。如果一個(gè)tomcat上,部署了多個(gè)應(yīng)用,這時(shí)候可以使用tomcat自身的SSO解決方案。如果系統(tǒng)跨JVM甚至跨平臺(tái),則需要一套復(fù) 雜的SSO解決方案。復(fù)雜的SSO解決方案需要自己開發(fā),或者使用第三方框架,如CAS, OPENSSO等。

這次的實(shí)驗(yàn),僅僅關(guān)注tomcat自帶的SSO方案。首先需要說明,tomcat自帶的SSO的必要前提是:

  1. 必須是Tomcat自帶的認(rèn)證方式:BA, FBA, Degist,client-cert
  2. 必須是在同一個(gè)tomcat vhost下。
  3. 同一個(gè)JVM中。
  4. 所有的應(yīng)用必須使用同一個(gè)domain。
  5. 需要cookie支持。cookie中會(huì)被插入JSESSIONIDSSO
  6. 所有應(yīng)用必須使用形同的realm。

接下來,我將重新復(fù)制一份新的tomcat, 取名tomcat3. 在tomcat3\webApps下面,tomcat自帶一個(gè)web應(yīng)用,叫做examples,其下/examples/jsp/security /protected/index.jsp是受FBA保護(hù)的。

修改server.xml,添加realm

 
 
  1.                resourceName="UserDatabase"/>--> 
  2.                
  3.     connectionName="cn=admin,dc=mycompany,dc=com" 
  4.     connectionPassword="admin" 
  5.      connectionURL="ldap://localhost:389" 
  6.       userPassword="userPassword" 
  7.        userPattern="uid={0},ou=people,dc=mycompany,dc=com" 
  8.           roleBase="ou=groups,dc=mycompany,dc=com" 
  9.           roleName="cn" 
  10.         roleSearch="(uniqueMember={0})" 
  11. /> 

繼續(xù)修改server.xml, 打來host下面的SSO配置:

 
 
  1.  

然后修改examples下面的web.xml, 將受保護(hù)的資源的允許訪問角色修改成:

 
 
  1.  
  2.     red 
  3.  

這樣,tomcat3下面就有一個(gè)使用OpenLDAP認(rèn)證的應(yīng)用examples了。接下來,我將examples復(fù)制一份,取名叫 examples2,放在相同目錄下?,F(xiàn)在tomcat3下面存在兩個(gè)應(yīng)用examples和examples2,它們使用同一個(gè)realm認(rèn)證。

啟動(dòng)tomcat3, 訪問http://localhost:8080/examples/jsp/security/protected/index.jsp和http://localhost:8080/examples2/jsp/security/protected/index.jsp, 發(fā)現(xiàn)只需要登錄其中一個(gè),另一個(gè)不再需要登錄。

接下來

由于FBA的缺陷,我們需要自己制作login機(jī)制。實(shí)際上很多互聯(lián)網(wǎng)網(wǎng)站都是自己的login機(jī)制。我將借助第三方認(rèn)證工具,比如SecurityFilter或Spring來重新制作login。鏈接稍后貼上。

原文鏈接:http://my.oschina.net/xpbug/blog/198765


網(wǎng)頁名稱:Tomcat認(rèn)證授權(quán)與簡(jiǎn)單的SSO
網(wǎng)站鏈接:http://m.5511xx.com/article/dppijcj.html