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: j.jones@ZTE.com

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: f.bloggs@ZTE.com

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

 

阅读更多

没有更多推荐了,返回首页