[置顶] 基于CAS实现单点登录(SSO):CAS+LDAP实现单点登录认证


    [一]、概述

    CAS是N个系统的中心认证入口,而贯穿多个系统的用户信息是共用的,应该被单独维护,而这些信息可能属于不用的系统,不用的组织,不用的国家,从而形成了树形结构,而使用关系型数据库维护树形结构信息是它的弱点,这就是本文CAS和LDAP整合的初衷。

    本来主要详细是介绍CAS和LDAP整合实现单点登录的步骤。

    [二]、详细步骤

    1、LDAP安装配置 

    详见:

    介绍openLDAP在windows上的安装配置

    安装配置,添加部分测试数据如下:


     

     2CAS的基础安装配置:

           见SSOCAS单点登录实例演示

     

     3CAS整合LDAP的配置

    如果是Mave构建项目的,添加LDAP的相关依赖:

    <dependency>
         <groupId>org.jasig.cas</groupId>
         <artifactId>cas-server-support-ldap</artifactId>
         <version>${cas.version}</version>
    </dependency>
     
    <!--仅仅在使用到连接池时添加该依赖
      <dependency>
          <groupId>commons-pool</groupId>
          <artifactId>commons-pool</artifactId>
          <version>${apache.commons.pool.version}</version>
      </dependency>
    -->

    如果不是maven项目,需要cas-server-support-ldap-3.4.11.jar(官网下载的发布包cas-server-3.5.2-release.zip的 modules下) 和spring-ldap-core-1.3.1.RELEASE.jar

     

    LDAP认证配置有两种:

    [第一种]FastBindLdapAuthenticationHandler 

    这种认证处理器一般用于DN是由用户名直接组成的,比如:uid=%u,ou=dev,dc=micmiu.com,dc=com ,其中 %u 就是CAS登录的用户名。

    修改web的配置文件 WEB-INF\deployerConfigContext.xml

    首先在<beans>跟节点下增加beanContextSource 的配置:

    <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
      <property name="pooled" value="false"/>
      <property name="url" value="ldap://127.0.0.1:389" />
      <property name="userDn" value="cn=Manager"/>
      <property name="password" value="secret"/>
      <property name="baseEnvironmentProperties">
    <map>
      <entry key="com.sun.jndi.ldap.connect.timeout" value="3000" />
      <entry key="com.sun.jndi.ldap.read.timeout" value="3000" />
      <entry key="java.naming.security.authentication" value="simple" />
    </map>
      </property>
    </bean>

     

    ContextSource 的配置说明:

    • 如果有多个LDAP服务器,可以通过参数urls 配置多个
    • FastBindLdapAuthenticationHandler配置时,这里的userDn 可以配置成 “cn=Manager,ou=dev,dc=micmiu,dc=com” 或 “cn=Manager,ou=dev”   “cn=Manager”  “Manager” 这四个都可以
    • 如果LDAP服务器有SSL,注意url配置的前缀是ldaps:”ldaps://192.168.8.150:636″

    在<bean id=”authenticationManager” />下找到SimpleTestUsernamePasswordAuthenticationHandler的配置,修改成如下:

    <bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler">
    <property name="filter" value="uid=%u,ou=Developer,dc=micmiu,dc=com" />
    <property name="contextSource" ref="contextSource" />
    </bean>


    配置好后分别启动三个应用:tomcat-cas、tomcat-app1、tomcat-app2,进行认证测试:

    • 输入Michael/111111 可以成功登录,
    • 输入Miumiu/111111  则登录失败

     

    [第二种]BindLdapAuthenticationHandler 

    这种认证处理器一般用于需要验证的用户名是DN的其他的属性比如email,而不是上面第一种处理器中的uid(当然uid属性同样适用,下面我们配置的示例是用mail)。

    修改web的配置文件 WEB-INF\deployerConfigContext.xml

    同样在<beans>跟节点下增加beanContextSource 的配置:

    <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="anonymousReadOnly" value="false" />
    <property name="password" value="secret" />
    <property name="pooled" value="true" />
    <property name="urls">
    <list>
    <value>ldap://127.0.0.1:389</value>
    </list>
    </property>
    <property name="userDn" value="cn=Manager,dc=micmiu,dc=com" />
    <property name="baseEnvironmentProperties">
    <map>
    <!-- LDAP SSL访问配置
    <entry key="java.naming.security.protocol" value="ssl" />
    -->
    <entry key="java.naming.security.authentication" value="simple" />
    </map>
    </property>
    </bean>

     

    在<bean id=”authenticationManager” />修改认证bean的配置,修改成如下:

    <bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">
    <property name="filter" value="mail=%u" />
    <property name="searchBase" value="dc=micmiu,dc=com" />
    <property name="contextSource" ref="contextSource" />
    <!-- 允许多个账号-->
    <property name="allowMultipleAccounts" value="true" />
    </bean>

     

    配置好后分别启动三个应用:tomcat-cas、tomcat-app1、tomcat-app2,进行认证测试:

    • 输入Michael/111111 可以成功登录,
    • 输入Miumiu/111111 也可以成功登录

     

    如果把参数:searchBase的值修改为:”ou=Developer,dc=micmiu,dc=com”,重新启动测试认证的结果如下:

    • 输入Michael/111111 可以成功登录,
    • 输入Miumiu/111111  则登录失败

    此时的认证效果和第一种的认证效果是一样的。

    有关连接池的配置可以参见官网介绍:https://wiki.jasig.org/display/CASUM/LDAP

    小结

    CAS和LDAP,主要应用在系统整合情景中,CAS做多个系统的统一认证入口,只需要登录一次便访问多个系统。
    而LDAP用来存储多个系统通用的信息,比如用户信息、用户权限信息,这些信息具有通用和简单(字符串为主)、更改性小的特点,又因为他们属于不同的组织,不同的系统,也就构成了树形的结构,形成了目录,这样的话,在匹配用户名和密码时,就可以做到高效的检索。

    源码下载 猛击

你可能感兴趣的:(cas,LDAP)