Liferay+CAS+LDAP认证
[font=Cambria]1. 相关知识介绍1. Oracle Berkeley DBOracle Berkeley DB 是行业领先的可嵌入开源数据库引擎,它为开发人员提供了无需管理的快速、可靠的本地持久性。Oracle Berkeley DB 是一个直接链接到您应用程序的库。您的应用程序进行简单的函数调用,而不是向远程服务器发送消息,从而消除了客户端-服务器体系结构的性能损耗。 OracleBerkeley DB 消除了 SQL 查询处理的开销,从而使应用程序按可预测的访问模式更快地运行。Berkeley DB 提供与传统关系数据库系统同样强健的数据存储特性,例如,ACID 事务和恢复;用于高并发性的锁定、多进程和多线程;冷热备份;以及用于高可用性应用程序的单主复制。Berkeley DB 可以在内存和/或磁盘中管理数据库。Berkeley DB 的运行完全无需人为管理,因此所有运行时管理都由应用程序(而非管理员)通过编程方式控制。它被设计为简单、快捷、小型和可靠的。Berkeley DB 支持跨多个系统的复制,从而使应用程序能够以较短的时间进行大规模扩展并为高可用性解决方案提供容错。该技术的工作机制是让所有更新进入一个指定的主中,该主自动将更改分发到一组副本。读负载可以跨这些副本分散,而新的副本可以随时加入该组来扩展此系统。如果任何副本失败,其余的副本可以取代它。如果主失败,应用程序可以进行选举或者简单地指定一个新主。选择新主后,所有副本与新主同步并在不中止服务的情况下继续进行正常处理。Berkeley DB 非常灵活并却允许开发人员控制其行为的众多方面,这使它可以跨大量应用程序使用并作为自主开发的解决方案的替代品。例如,开发人员可以控制资源的分配方式、专门用于缓存记录的内存量、用于单个表的磁盘存储结构、持久性和隔离保证以及复制策略。它包括用于较容易的移植、集成、调试和优化的完整源代码。Berkeley DB 为需要本地存储数据、无需人为管理连续运行并且以可预测的方式访问数据的应用程序提供非常快速、可靠和可伸缩的持久性。 主要特性1) 数据存储Berkeley DB 可以轻松快捷地存储数据,而不会导致其他数据库中的开销。Berkeley DB 是一个与您的应用程序运行在同一进程中的 C 库,避免了使用远程数据库服务器的进程间通信延迟。共享缓存在内存中保存最活跃的数据,避免了开销较大的磁盘访问。* 本地、进程中数据存储* 与模式无关的、应用程序本机数据格式* 索引检索和顺序检索(B 树、队列、Recno、散列)* 每应用程序多进程和每进程多线程* 针对高并发系统的细粒度、可配置的锁定* 多版本并发控制 (MVCC)* 对辅助索引的支持* 内存中和/或磁盘上* 联机 B 树压缩* 联机 B 树磁盘空间回收* 联机放弃的锁删除* 硬盘上数据加密 (AES)* 记录最大可达 4GB,表最大可达 256TB2) 事务Berkeley DB 可靠地存储数据并确保数据完整性,就像对所有实际数据库的预期一样。Berkeley DB 允许将一组数据库操作组合在一起,这样它们要么都成功完成,要么都不完成。如果系统出现故障,Berkeley DB 将自动恢复,而部分完成的事务将回滚以确保系统处于一致的状态。* 完全符合 ACID* 可选择的隔离级别和持久性保证,可在每事务基础上进行配置* 支持嵌入式事务* 分布式事务 (XA)* 灾难和例程故障恢复模式* 自动恢复序列化* 灵活、可配置的死锁检测* 支持应用程序特定的日志文件记录和恢复* 冷热备份、日志文件存档和完整的数据库转储3) 复制当需要较高的系统伸缩性和/或可用性时,Berkeley DB 提供一流的复制功能,从而使一组系统可以处理工作负载。复制可以跨一个机架中的多个主板、一个数据中心中的多台服务器或地理上分散的位置。该复制系统的所有方面(数据完整性、事务保证、吞吐量、网络传输等)都是可配置的,并且可以调整以满足应用程序的特定要求。* 单主、多副本模型* 自动故障切换/重选* 符合 Paxos 的选举算法* 新副本可随时加入组中* 热备份* 无停止升级* 地理上分散的节点* 内存中复制选项* 客户端到客户端复制* 延迟的客户端同步* 同步终止* 网络传输不可知* 已证实对数千个副本节点具有可伸缩性* 预置的复制框架,用于更快速的开发4) 部署Berkeley DB 非常灵活、易于部署且易于集成。作为一个 C 库,它可与您的应用程序一同安装和配置。BerkeleyDB 的运行完全无需人为管理,因此所有的管理功能都是通过编程方式控制。它支持的编程语言和操作系统平台范围广泛。Berkeley DB 在数百万个部署中得到了证明,从任务关键的电信运营商级别应用程序到桌面和移动设备应用程序。* 编程管理 — 无需人为管理* 语言支持(C、C++、Java、Perl、Python、PHP、Tcl、Ruby 等等)* 操作系统支持(Linux、Windows、BSD UNIX、Solaris、Mac OS/X、VxWorks 和任何符合 POSIX 的操作系统)* 适用于 Microsoft Windows 的安装程序* Apache 集成* 支持 RPC 的 API* 支持内存限制下的移动设备(只有 400KB 大小)* 可扩展到数以 TB 计的数据,数十亿条记录* 包含源代码、测试套件2. LDAPLDAP(轻量级目录访问协议,LightweightDirectory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP之上的访问协议—LDAP。LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中表的记录;条目是具有区别名DN (Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于关系数据库表中的关键字(PrimaryKey)。属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。类型的一个例子就是mail,其值将是一个电子邮件地址。LDAP的信息是以树型结构存储的,在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织 (organization)(o=Acme)或组织单元(organizational units)(ou=People)。一个组织单元可能包含诸如所有雇员、大楼内的所有打印机等信息。此外,LDAP支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:inetorgPerson对象类需要支持sn(surname)和cn(commonname)属性,但也可以包含可选的如邮件,电话号码等属性。设计目录结构设计目录结构是LDAP最重要的方面之一。下面我们将通过一个简单的例子来说明如何设计合理的目录结构。该例子将通过Netscape地址薄来访文。假设有一个位于美国US(c=US)而且跨越多个州的名为Acme(o=Acme)的公司。Acme希望为所有的雇员实现一个小型的地址薄服务器。我们从一个简单的组织DN开始: dn: o=Acme, c=USAcme所有的组织分类和属性将存储在该DN之下,这个DN在该存储在该服务器的目录是唯一的。Acme希望将其雇员的信息分为两类:管理者(ou=Managers)和普通雇员(ou=Employees),这种分类产生的相对区别名(RDN,relative distinguishednames。表示相对于顶点DN)就是 :dn: ou=Managers, o=Acme, c=USdn: ou=Employees, o=Acme, c=US在下面我们将会看到分层结构的组成:顶点是US的Acme,下面是管理者组织单元和雇员组织单元。因此包括Managers和Employees的DN组成为: dn: cn=Jason H. Smith,ou=Managers, o=Acme, c=US dn: cn=Ray D. Jones, ou=Employees,o=Acme, c=US dn: cn=Eric S. Woods,ou=Employees, o=Acme, c=US为了引用Jason H. Smith的通用名(common name)条目,LDAP将采用cn=Jason H. Smith的RDN。然后将前面的父条目结合在一起就形成如下的树型结构: cn=Jason H. Smith + ou=Managers + o=Acme + c=US -> cn=Jason H. Smith, ou=Managers, o=Acme, c=US现在已经定义好了目录结构,下一步就需要导入目录信息数据。目录信息数据将被存放在LDIF文件中,其是导入目录信息数据的默认存放文件。用户可以方便的编写Perl脚本来从例如/etc/passwd、NIS等系统文件中自动创建LDIF文件。下面的实例保存目录信息数据为testdate.ldif文件,该文件的格式说明将可以在manldif中得到。在添加任何组织单元以前,必须首先定义Acme DN: dn: o=Acme, c=US objectClass:organization o: Acme 这里o属性是必须的下面是管理组单元的DN,在添加任何管理者信息以前,必须先定义该条目。 dn: ou=Managers,o=Acme, c=US objectClass:organizationalUnitou: Managers 这里ou属性是必须的。
第一个管理者DN: dn: cn=Jason H. Smith,ou=Managers, o=Acme, c=US objectClass:inetOrgPerson cn和sn都是必须的属性: cn: Jason H. Smith sn: Smith 但是还可以定义一些可选的属性: telephoneNumber:111-222-9999 mail:headhauncho@acme.com localityName: Houston
可以定义另外一个组织单元: dn: ou=Employees,o=Acme, c=US objectClass: organizationalUnit ou: Employees
并添加雇员信息如下: dn: cn=Ray D. Jones,ou=Employees, o=Acme, c=US objectClass:inetOrgPerson cn: Ray D. Jones sn: Jones telephoneNumber:444-555-6767 mail: mailto:jonesrd@acme.com]jonesrd@acme.com localityName: Houston
dn: cn=Eric S. Woods,ou=Employees, o=Acme, c=US objectClass:inetOrgPerson cn: Eric S. Woods sn: Woods telephoneNumber:444-555-6768 mail: mailto:woodses@acme.com]woodses@acme.com localityName: Houston注:空行为分割符。每个dn直接必须要有
[font=Cambria]2. LDAP安装与配置1. LDAP安装在安装OpenLDAP之前必须安装BerkeleyDB。1.1 安装Berkeley DB # cd /usr/local/src # wgethttp://download.oracle.com/berkeley-db/db-4.6.18.tar.gz]http://download.oracle.com/berkeley-db/db-4.6.18.tar.gz # tar -zxvf db-4.6.18.tar.gz # cd db-4.6.18 # cd build_unix Berkeley DB默认是安装在/usr/local/BerkeleyDB.4.6目录下,其中4.6就是版本号,你也可以指定–prefix参数来设置安装目录。(也可以用最新版的) # ../dist/configure--prefix=/usr/local/berkeleydb --enable-cxx 其中–enable-cxx就是编译C++库,这样才能编译Berkeley DB数据库的PHP扩展php_db4。 # make # make install # echo '/usr/local/berkeleydb/lib/'>> /etc/ld.so.conf # ldconfig1.2 安装OpenLDAP: #cd /usr/local/src/openldap #env CPPFLAGS="-I/usr/local/berkeleydb/include"LDFLAGS="-L/usr/local/berkeleydb/lib"./configure--prefix=/usr/local/openldap --enable-crypt --enable-spasswd --enable-wrappers--enable-slurpd #make depend #make #make test #make install2. LDAP配置2.1 修改ldap配置文件 /usr/local/openldap/etc/openldap/slapd.conf 增加 include/usr/local/openldap/etc/openldap/schema/cosine.schema include/usr/local/openldap/etc/openldap/schema/inetorgperson.schema 去掉如下访问控制命令的注释: access to * by self write by users read by anonymous auth 修改DB部分的配置,具体内容参照实际的组织机构: database bdb suffix "o=gfkd,c=cn" rootdn "cn=root, o=gfkd,c=cn " rootpw {MD5}SuZHpxPehPwmwUtapGLMLg== (也可以直接写明码ceipportal) 注意:根用户密码采用了MD5加密,可以通过命令slappasswd来得到: slappasswd -h {MD5}2.2 定义ldap服务器,可以用主机名或ip地址 /etc/openldap/ldap.conf 增加 host 127.0.0.12.3 启动openldap /usr/local/openldap/libexec/slapd &2.4 导入数据进行测试 ldapadd -x -D"cn=root,dc=gfkd,dc=mtn,c=cn" -W -f /usr/local/openldap/var/test.ldif ldapsearch ……来查看是否添加成功 自己编写test.ldif文件,可以看第一章的资料介绍,设计平台的LDAP数据库结构代码如下: dn:o=gfkd,c=cn objectClass: organization dc:gfkd
dn: ou=users, o=gfkd,c=cnobjectClass: topobjectClass: organizationalUnitou: users
dn: ou=groups, o=gfkd,c=cnobjectClass: topobjectClass: organizationalUnitou: groups
dn: cn=bruno,ou=users, o=gfkd,c=cnobjectClass: topobjectClass: personobjectClass: organizationalPersonobjectClass: inetOrgPersoncn: brunosn: brunouserPassword: 00000000mail: mailto:bruno@gfkd.mtn]bruno@gfkd.mtngivenName: Brunotitle: manager
数据库结构如下图:[img=288,269]file:///C:\Users\cyj\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg[/img]
[font=Cambria]3. LDAP数据相关命令操作[font=Cambria]1. slapd4 使用IPv4标准6 使用IPv6标准-d debug模式一般用 -1,1,256-f 指定配置文件的路径-h 可以指定启动服务的端口 ldap://:2004 用2004端口启动服务可以输入- help来查看跟多[font=Cambria]2. ldapadd-x 进行简单认证-D 用来绑定服务器的DN-h 目录服务的地址-w 绑定DN的密码-f 使用ldif文件进行条目添加的文件#ldapadd -x -D “cn=root, o=gfkd,c=cn” -w secret -f /root/test.ldifldapadd -x -D “cn=root,o=gfkd,c=cn” -w secret (这样写就是在命令行添加条目)[font=Cambria]3. ldapsearch-x 进行简单认证-D 用来绑定服务器的DN-w 绑定DN的密码-b 指定要查询的根节点-H 制定要查询的服务器#ldapsearch -x-D “cn=root, o=gfkd,c=cn” -w secret -b “dc=starxing,dc=com”使用简单认证,用“cn=root,o=gfkd,c=cn” 进行绑定,要查询的根是“o=gfkd,c=cn”。这样会把绑定的用户能访问”o=gfkd,c=cn”下的所有数据显示出来。[font=Cambria]4. ldapdelete参数和ldapadd差不多,就不写了#ldapdelete -x-D ‘cn=root,dc=it,dc=com’ -w secert ‘uid=zyx,dc=it,dc=com’这样就可以删除’uid=zyx,dc=it,dc=com’记录了,应该注意一点,如果o或ou中有成员是不能删除的。[font=Cambria]5. ldappasswd-x 进行简单认证-D 用来绑定服务器的DN-w 绑定DN的密码-S 提示的输入密码-s pass 把密码设置为pass-a pass 设置old passwd为pass-A 提示的设置old passwd-H 是指要绑定的服务器-I 使用sasl会话方式#ldappasswd -x-D ‘cm=root,dc=it,dc=com’ -w secret ‘uid=zyx,dc=it,dc=com’ -SNew password:Re-enter newpassword:就可以更改密码了,如果原来记录中没有密码,将会自动生成一个userPassword。[font=Cambria]6. ldapmodify-a 添加新的条目.缺省的是修改存在的条目.-C 自动追踪引用.-c 出错后继续执行程序并不中止.缺省情况下出错的立即停止.比如如果你的ldif 文件内的某个条目在数据库内并不存在,缺省情况下程序立即退出,但如果使用了该参数,程序忽略该错误继续执行.-n 用于调试到服务器的通讯.但并不实际执行搜索.服务器关闭时,返回错误;服务器打开时,常和-v 参数一起测试到服务器是否是一条通路.-v 运行在详细模块.在标准输出中打出一些比较详细的信息.比如:连接到服务器的ip 地址和端口号等.-M[M] 打开manage DSA IT 控制. -MM 把该控制设置为重要的.-f file 从文件内读取条目的修改信息而不是从标准输入读取.-x 使用简单认证.-D binddn 指定搜索的用户名(一般为一dn 值).-W 指定了该参数,系统将弹出一提示入用户的密码.它和-w 参数相对使用.-w bindpasswd 直接指定用户的密码. 它和-W 参数相对使用.-H ldapuri 指定连接到服务器uri(ip 地址和端口号,常见格式为ldap://hostname:port).如果使用了-H 就不能使用-h 和-p 参数.-h ldaphost 指定要连接的主机的名称/ip 地址.它和-p 一起使用.-p ldapport 指定要连接目录服务器的端口号.它和-h 一起使用.如果使用了-h 和-p 参数就不能使用-H 参数.-Z[Z] 使用StartTLS 扩展操作.如果使用-ZZ,命令强制使用StartTLS 握手成功.-V 启用证书认证功能,目录服务器使用客户端证书进行身份验证,必须与-ZZ 强制启用TLS 方式配合使用,并且匿名绑定到目录服务器.-e 设置客户端证书文件,例: -e cert/client.crt-E 设置客户端证书私钥文件,例: -E cert/client.key#ldapmodify -x-D “cn=root,dc=it,dc=com” -W -f modify.ldif将modify.ldif中的记录更新原有的记录。[font=Cambria]4. CAS-LDAP认证实现4.1 加载相关jar包1. cas-server-support-ldap-3.3.1.jar2. spring-ldap-1.3.0.RELEASE-all.jar4.2 修改deployerConfigContext.xml 将deployerConfigContext.xml修改为: […]
[font=Cambria]5. Liferay+LDAP认证实现第一步:[img=747,403]file:///C:\Users\cyj\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg[/img]第二步:[img=619,454]file:///C:\Users\cyj\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg[/img]第三步:[img=701,528]file:///C:\Users\cyj\AppData\Local\Temp\msohtmlclip1\01\clip_image008.jpg[/img] 注:1. Base Provider URL:根据LDAP服务器地址填写2. Base DN:LDAP的base dn设置3. Principal:是LDAP管理员的dn信息4. Credentials:管理员密码5. 导入是指从LDAP导入到平台数据库,导出则相反。6. 建议启动导入和导出功能保持平台数据库和LDAP一致,导入间隔时间,注意时间太短会影响性能。7. 注册新用户和用户进行资料修改,密码修改后,点击保存,LDAP会自动更新。8. LDAP必须填写的内容有:cn,sn,givenName,mail,title,userPassword