当前位置: 首页>后端>正文

ldap是sso的一种吗 ldap和sso

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==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://www.xamrdz.com/backend/3zz1964096.html

相关文章: