自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Tomcat認(rèn)證授權(quán)與簡單的SSO

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

回顧

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

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

基本概念

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

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

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

本實驗簡介

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

OpenLDAP安裝配置

  1. 下載并安裝軟件 http://sourceforge.net/projects/openldapwindows/ OpenLDAP會被安裝成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)容如下。其中定義了兩個用戶,和兩個角色。
  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. 運行命令 slapadd.exe -l my.ldif

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

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

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

 

#p#

為Tomcat配置Realm

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

  1. <!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
  2.                resourceName="UserDatabase"/> 
  3.         --> 
  4. <Realm   className="org.apache.catalina.realm.JNDIRealm" 
  5.     connectionName="cn=admin,dc=mycompany,dc=com" 
  6.     connectionPassword="admin" 
  7.      connectionURL="ldap://localhost:389" 
  8.       userPassword="userPassword" 
  9.        userPattern="uid={0},ou=people,dc=mycompany,dc=com" 
  10.        <!--userRoleName="memberOf"--> 
  11.           roleBase="ou=groups,dc=mycompany,dc=com" 
  12.           roleName="cn" 
  13.         roleSearch="(uniqueMember={0})" 
  14. /> 

重啟tomcat集群。

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

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

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

  1. <security-constraint> 
  2.   <web-resource-collection> 
  3.     <web-resource-name>result</web-resource-name> 
  4.     <url-pattern>/successful.jsp</url-pattern> 
  5.   </web-resource-collection> 
  6.   <auth-constraint> 
  7.     <role-name>red</role-name> 
  8.   </auth-constraint> 
  9. </security-constraint> 
  10. <login-config>  
  11.     <auth-method>BASIC</auth-method>  
  12.     <realm-name>tomcat</realm-name>  
  13. </login-config> 
  14. <security-role> 
  15.   <role-name>red</role-name> 
  16. </security-role> 
  17. <security-role> 
  18.   <role-name>black</role-name> 
  19. </security-role> 

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

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

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

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

  1. <form action="j_security_check" method="post"> 
  2.     Username<input type="text" name="j_username" /><br /> 
  3.     Password<input type="password" name="j_password" /><br /> 
  4.     <input type="submit" value="login" /> 
  5. </form> 

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

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

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

  1. <login-config>  
  2.     <auth-method>FORM</auth-method>  
  3.     <form-login-config> 
  4.         <form-login-page>/login.html</form-login-page> 
  5.         <form-error-page>/login.html</form-error-page> 
  6.     </form-login-config> 
  7. </login-config> 

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

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

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

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

  1. <Proxy balancer://mycluster> 
  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.    </Proxy> 

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

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

  1. <VirtualHost *:80> 
  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. </VirtualHost> 

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

#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一個Login頁面。直接訪問login.html是無法提交form的。login只能在訪問受保護(hù)資源的時候才會被觸發(fā)。

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

Tomcat build-in SSO

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

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

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

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

修改server.xml,添加realm

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

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

  1. <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 

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

  1. <auth-constraint> 
  2.     <role-name>red</role-name> 
  3. </auth-constraint> 

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

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

接下來

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

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

 

責(zé)任編輯:陳四芳 來源: 開源中國博客
相關(guān)推薦

2023-06-16 08:13:57

2024-09-11 08:37:39

2014-04-22 10:15:38

vCenter SSO身份認(rèn)證

2013-03-28 09:35:31

企業(yè)級系統(tǒng)

2014-02-25 10:37:16

自動化運維SSO單點登錄

2022-05-12 07:37:51

單點登錄微服務(wù)開源

2024-06-05 06:43:20

2019-03-27 15:51:51

API 認(rèn)證授權(quán)

2021-10-29 13:26:54

單點登錄SSO

2021-09-17 09:00:00

安全身份認(rèn)證OAuth 2.0

2019-05-20 14:57:35

Tomcat容器安全

2021-09-28 10:48:07

開源雙因素認(rèn)證單點登錄

2009-06-15 14:16:17

JBoss與Tomca

2021-07-12 07:08:53

OAuth 2.0授權(quán)協(xié)議

2021-07-07 07:33:49

開源Keycloak平臺

2022-09-22 10:01:47

微服務(wù)授權(quán)認(rèn)證

2009-07-09 14:02:58

Tomcat JDK

2009-07-06 17:49:02

Apache的配置JBoss的配置

2009-10-22 16:38:09

Oracle用戶

2010-08-19 11:47:28

點贊
收藏

51CTO技術(shù)棧公眾號