Tomcat認證授權實現SSO

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/lost_wen/article/details/56664626

Tomcat認證授權實現SSO

本文檔旨在說明如何採用Tomcat的Single Sign-On來爲網站開啓ldap認證,從而實現用戶Login一次之後,可以訪問同一Server上的不同Webapp。

一、       OpenLDAP安裝配置

1.下載安裝OpenLDAP for windows版本,默認安裝即可

2.修改slapd.conf配置文件

      補全include:

include              ./schema/core.schema

include              ./schema/cosine.schema

include              ./schema/nis.schema

include              ./schema/inetorgperson.schema

include              ./schema/openldap.schema

include              ./schema/dyngroup.schema

include              ./schema/collective.schema

include              ./schema/corba.schema

include              ./schema/duaconf.schema

include              ./schema/java.schema

include              ./schema/kerberos.schema

include              ./schema/misc.schema

include              ./schema/pmi.schema

include              ./schema/ppolicy.schema

       聲明自己的後綴和管理員:

       suffix            "dc=ZTE,dc=com"

       rootdn          "cn=admin,dc=ZTE,dc=com"

       rootpw    admin

3.打開系統服務,重啓服務OpenLDAP

4. 創建my.ldif文件,其中定義了兩個用戶(tom&jerry),和兩個角色(red&black),文件內容如下

# Define top-level entry

dn: dc=ZTE,dc=com

objectClass: dcObject

objectClass: organization

o: ZTE

dc:ZTE

 

# Define an entry to contain people

# searches for users are based on thisentry

dn: ou=people,dc=ZTE,dc=com

objectClass: organizationalUnit

ou: people

 

# Define a user entry

dn: uid=tom,ou=people,dc=ZTE,dc=com

objectClass: inetOrgPerson

uid: tom

sn: jones

cn: janet jones

mail: [email protected]

userPassword: tom

 

# Define a user entry for Fred Bloggs

dn: uid=jerry,ou=people,dc=ZTE,dc=com

objectClass: inetOrgPerson

uid: jerry

sn: bloggs

cn: fred bloggs

mail: [email protected]

userPassword: jerry

 

# Define an entry to contain LDAP groups

# searches for roles are based on thisentry

dn: ou=groups,dc=ZTE,dc=com

objectClass: organizationalUnit

ou: groups

 

# Define an entry for the "red"role

dn: cn=red,ou=groups,dc=ZTE,dc=com

objectClass: groupOfUniqueNames

cn: red

uniqueMember: uid=tom,ou=people,dc=ZTE,dc=com

uniqueMember:uid=jerry,ou=people,dc=ZTE,dc=com

 

# Define an entry for the "black"role

dn: cn=black,ou=groups,dc=ZTE,dc=com

objectClass: groupOfUniqueNames

cn: black

uniqueMember:uid=jerry,ou=people,dc=ZTE,dc=com

5.打開LdapAdmin管理工具,導入my.ldif文件

 

二、       配置Tomcat build-in SSO

1. 修改server.xml

      添加realm:

  <!-- <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"

              resourceName="UserDatabase"/> -->

         <Realm  className="org.apache.catalina.realm.JNDIRealm"

                connectionName="cn=admin,dc=ZTE,dc=com"

                connectionPassword="admin"

                 connectionURL="ldap://10.43.163.175:389"

                 userPassword="userPassword"

                  userPattern="uid={0},ou=people,dc=ZTE,dc=com"                  

                         roleBase="ou=groups,dc=ZTE,dc=com"

                         roleName="cn"

                       roleSearch="(uniqueMember={0})"

         />

放開host下面的SSO配置:

<ValveclassName="org.apache.catalina.authenticator.SingleSignOn" />

2.修改兩個項目的web.xml

       <security-constraint>

         <web-resource-collection>

              <web-resource-name>result</web-resource-name>

              <url-pattern>/index.html</url-pattern>

         </web-resource-collection>

         <auth-constraint>

           <role-name>red</role-name>

              <role-name>black</role-name>

         </auth-constraint>

 </security-constraint>

 

 <login-config>

     <auth-method>FORM</auth-method>

     <realm-name>Example Form-Based AuthenticationArea</realm-name>

     <form-login-config>

       <form-login-page>/login.html</form-login-page>

              <form-error-page>/login.html</form-error-page>       

     </form-login-config>

   </login-config>

 

 <security-role>

         <role-name>red</role-name>

       </security-role>

       <security-role>

         <role-name>black</role-name>

       </security-role>

3.設計登錄頁面

<formaction="j_security_check" method="post">

   Username<input type="text" name="j_username"/><br />

   Password<input type="password" name="j_password"/><br />

   <input type="submit" value="login" />

</form>

  *注意form中的action以及user和password的input的name屬性,“j_security_check","j_username"和"j_password"這些是固定的,嚴格遵循J2EE規範。

  4.重啓tomcat,訪問項目發現會自動跳轉到登錄頁面,成功登錄後兩個項目之間即共享用戶登錄信息。

 

三、       如何獲取當前登錄用戶信息

原本都習慣在login以後,把一些login用戶信息放到session裏面的. 現在認證都交給container去做了,我們的webapp怎麼拿到login用戶信息呢? 確實,現在我們的webapp能做的,只有從request裏面拿到login用戶的remoteUser了。

              String remoteUser = request.getRemoteUser();

       只有通過安全認證後才能獲取remoteUser相關信息,否則remoteUser==null。

 

四、       退出用戶登錄

只需要執行session.invalidate(),然後跳轉到登出頁面即可。

 

五、       FBA(Form-based Authentication)的缺陷

1. login的過程無法被幹預。我們無法通過添加filter的形式進行干預。login完全交給web容器處理,頁面也是有web容器負責展示。

2. 直接訪問login.html是無法提交form的。login只能在訪問受保護資源的時候纔會被觸發。

 

六、       名詞解釋

Realm:

      Realm是web容器所持有的用戶集合。無論tomcat, glassfish,jboss還是websphere,均是符合j2ee規範或最佳實現。Realm是需要網站系統管理員進行配置的。常見的Realm有三種:數據庫,LDAP和文件系統。數據庫realm是指用戶信息都存在數據庫中,Ldap則存放在ldap中,文件系統的realm則是用戶信息按照一定的格式,存放於文件中。Realm是認證的關鍵,web容器會將用戶輸入的用戶名和密碼跟realm中的用戶信息進行比對。當比對成功的時候,認證也就成功了。

Role:

      這是授權的部分。當Realm被配好以後,系統管理員可以爲realm中的用戶分配角色。建立用戶role-mapping.每次用戶通過web容器的認證以後,web容器會將其role信息也查詢出來,放入用戶信息中。

User:

      區別一個用戶的唯一識別。(此處未使用)

security-constraint:

      這是web應用web.xml中的配置。 一個web應用將在web.xml中聲明其受保護的資源,並聲明某種角色可以訪問受保護的資源。

auth-method:

      一般認證方式分爲Basic Authentication(BA)和Form-basedAuthentication(FBA)。若使用BASIC方式,當你去訪問受保護認證的資源時,瀏覽器會彈出一個小窗口讓你輸入用戶名和密碼。FORM是可以自己寫login畫面的,當然html對form內容有些規定(要符合j2ee和container的要求)。此外還有其他的如DIGEST、CLIENT-CERT。

realm-name:

      這個realm-name是這個webapp的認證realm名,注意幾個處於同一SSO下的webapp,他們的realm-name要設成一樣的值。 如果不設成一樣,那麼換一個webapp就要重新認證一次,達不到SSO的效果。

 

七、       參考文章

https://my.oschina.net/xpbug/blog/198765

http://bbs.csdn.net/topics/390203738

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章