900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > CAS SSO 单点登录 【完整版】

CAS SSO 单点登录 【完整版】

时间:2022-10-07 19:38:39

相关推荐

CAS SSO 单点登录 【完整版】

什么是单点登录?什么是SSO?

SSO就是单点登录!!!

SSO即Single Sign On。

可是为什么我们要单点登录呢?为什么不能把所有的系统做成一个war包里呢?

道理很简单啊,如果这个银行这个企业全是你一家公司里的一个项目组包下来了,然后是从头开始开发,你当然可以把所有的功能模块做到一个WAR工程中啊。

可是很多时侯我们是做一个工程或者是两个工程然后需要和另一个工程去做结合,每个工程都有一个入口地址,对吧?那么我们从用户的角度出发来说:

如果一个企业的工作人员需要操作4,5个不同的系统如:HR系统、报销系统、进销存系统还有企业内的eLearning系统和SAP系统,那么他要登录5次对不对?要登录5次?

那么有人说了,为什么这么麻烦呢?我们不能把所有的系统除了一个主系统,然后让用户只要登录一次,再把其它系统的链接以菜单的形式挂在主系统的菜单点,然后去除登录功能,这样用户不就可以只需要登录一次了呢?

答案当然是:你可以这样做。

可是安全性呢?

因此我们引入了单点登录的概念,我们可以想一下,用户面对10几个系统,这10几个系统只有一个“表皮”(主页),在这个主页中有许多的外挂连接,连向10几个子系统,这10几个子系统每个都需要根据用户名和密码来判断用户是否对于本系统有无操作权限?但是用户只需要在这个“表皮”上登录一次,当他点每一个菜单链接时,系统会自动把用户名和密码做一次匹配然后根据权限系统来判断该用户是否具有相应的权限,进而使得用户可以通过主页再链入不同的子系统中,这就是单点登录。

或许是中文翻译的问题,我们就从Single Sign On这3个字来理解,只需登录一记,啊。。。这就对了,多个系统我只需要登录一次。

我们进一步设想一下,其实用户还是登录了两次,为什么呢?

对于正规的企业来说都有一个“域登录”,即WINDOWS域我们又称之为Active Directory,简称AD域,用户打开WIN7,WIN8, WINDOWS SERVER。。。bla...bla...bla...what every啦。

此时他需要输入域帐号,登录一次。

然后他进入WINDOWS桌面后,打开IE,点开公司内部OA系统,做报销或者是做请假,又登录一次。

其实是两次登录。

因此做的好的SSO,因该是怎么样啊?

即让用户登录一次,就是用户一旦登录了公司的AD域后,他在IE里打开公司内部的一些网址都无需再做登录了,因为用户的AD域帐户就是它的系统帐户。

如:公司内每个员工的邮箱帐号,它打开OUTLOOK后就自动连上了相关的MAIL服务器,然后该员工的AD域帐号加上@xxx.xxx这样的格式,这不就是他公司的邮件地址了,对吧?

对不对?这就是一个SSO的活生生的例子。

那么很多时候,确实,为了安全,我们可以让员工在登录了AD域后再打开IE,然后输入公司内的OA网址时再登录一次,这样做其实也是可以,而公司内的OA一般不仅仅只是一个系统,它一定一定是连接着多个子系统。

比如说我们一个公司的OA系统是一个EAR,它下挂有10多个WAR。

甚至一些公司还会外接如:SalesForce, SAP等其它系统,因此我们把员工打开的这层公司OA系统的最外面的这层“皮”,称之为PORTAL。

对的,PORTAL里一定含有SSO,在此先提一下。

下面是一些著名的调查公司显示的统计数据:

用户每天平均16分钟花在身份验证任务上 - 资料来源:IDS频繁的IT用户平均有21个密码 - 资料来源:NTA Monitor Password Survey49%的人写下了其密码,而67%的人很少改变它们每79秒出现一起身份被窃事件 - 资料来源:National Small Business Travel Assoc全球欺骗损失每年约12B - 资料来源:Comm Fraud Control Assoc 使用“单点登录”整合后,只需要登录一次就可以进入多个系统,而不需要重新登录,这不仅仅带来了更好的用户体验,更重要的是降低了安全的风险和管理的消耗。

请看下面的统计数据:

提高IT效率:对于每1000个受管用户,每用户可节省$70K帮助台呼叫减少至少1/3,对于10K员工的公司,每年可以节省每用户$75,或者合计$648K生产力提高:每个新员工可节省$1K,每个老员工可节省$350 - 资料来源:GigaROI回报:7.5到13个月 - 资料来源:Gartner 另外,使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中,服务和服务之间,程序和程序之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能够大大简化SOA的安全问题,提高服务之间的合作效率。

以下是一个标准的企业内通过SSO来集成各个系统间的认证与权限的模型图

好了,以上基本知识普及完毕开始我们的SSO实现。

CAS SSO

SSO实现有很多产品,我们今天选用的这个是耶鲁大学发明的CAS SSO服务器。这个CAS SSO是目前我看到过的功能较全的,使用也是最简单的配置式SSO服务器,它基于spring的原理,因此这个配置文件我们看起来因当是相当的熟悉的。

它分为Server版和Client版2个模块,同时它对于一些其它功能特性如:数据库、LDAP协议(就是WINDOWS AD域使用的协议)、安全等还提供了一系列的插件。因此,在本例中,我使用的是:

Server端:

Cas Server 3.5.2

Client端:

Cas Client 3.2.1

注:

请严格按照我的版本号进行试验。

什么叫Server端 ,什么叫Client端?

看上图,假设我们有3个War包。

一个叫cas-server.war,它放在tomcat里;一个叫cas-sample-site1.war,它放在jboss里;一个叫cas-sample-site2.war,它放在jboss里;

那么位于tomcat里的cas-server.war,它就是我们的CAS的Server端,位于jboss里的两个war就是我们CAS的client端。

SSO中的Server端与Client端概念搞清后,我们现在就开始布署吧。

布署cas-server

先说一下我们的环境:

我们把Server端解压得到以下这样的一个文件夹

它里面含了一堆的东西,关键在于以下这个文件夹

进入该文件夹,找到这样一个war包。

把这个war包解压后重命名成cas-server.war,放于tomcat的webapp目录中去,启动tomcat一切无误后即可。

然后我们打开一个ie,输入http://localhost:9090/cas-server会得到以下这个界面,那就说明你的cas sso已经安装成功了。

配置CAS SERVER

添加依赖包

在本例中我们将使用Oracle数据库中自建一个用户表来管理我们的用户名和密码,因此:

将oracle的ojdbc6.jar放入tomcat的lib目录内D:\tomcat\lib将cas-server-3.5.2-release\cas-server-3.5.2\modules下的这几个文件拷入tomcat\webapp\cas-server\web-inf\lib目录内

修改配置文件

CAS SSO的好处在于它的配置文件是完全spring的,你只要懂spring就可以非常容易的在里面去添加修改自己的一些功能,我们在第一天的教程中为了尽量简单,我们只需要改动一个文件,它就是:

tomcat\webapps\cas-server\WEB-INF目录下的

deployerConfigContext.xml文件

我们用纯文件编辑器打开它,找到下面这行:

[html]view plaincopy<beanclass="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/>

把它注释掉[html]view plaincopy<!-- <beanclass="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/> --> 然后再在它下面添加如下内容[html]view plaincopy<!-- <beanclass="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/> -->[html]view plaincopy<beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <propertyname="dataSource"ref="dataSource"></property> <propertyname="sql"value="selectpasswordfromsys_userwhereuser_id=?"></property> </bean>

好,这边我们看到了一个dataSource对吧,EASY,来。。。

[html]view plaincopy<!-- <beanclass="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"/> --> <beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <propertyname="dataSource"ref="dataSource"></property> <propertyname="sql"value="selectpasswordfromsys_userwhereuser_id=?"></property> </bean> </list> </property> </bean> <beanid="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <propertyname="driverClassName"value="oracle.jdbc.OracleDriver"/> <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/> <propertyname="username"value="ymk"/> <propertyname="password"value="password_1"/> </bean>

注意我加的这个dataSource的bean和刚才那段配置代码之间的位置对应关系哦,别胡乱搞一个回车就乱加一行哦。

全加完了,怎么样啦?完成了吗?

还没,CAS SSO严格意义上来说需要J2EE APP SERVER里实现HTTPSSSL的双向认证模式才能正常使用,但是我们因为这个是教程,因此不想搞了太麻烦,我们可以在“不使用HTTPS认证”的情况下也可以使用CAS SSO。

为此,我们要关闭CAS SSO的HTTPS认证模式,编辑:

tomcat\webapps\cas-server\WEB-INF\spring-configuration目录下的

ticketGrantingTicketCookieGenerator.xml文件

找到下面这行

[html]view plaincopy<beanid="ticketGrantingTicketCookieGenerator"class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="true" p:cookieMaxAge="-1" p:cookieName="CASTGC" p:cookiePath="/cas"/> </beans> 把这边的p:cookieSecure从true改为false即可。

然后我们在oracle中建一个用户表吧,建表语句如下:

[sql]view plaincopyCREATETABLESYS_USER ( "USER_ID"VARCHAR2(16), "PASSWORD"VARCHAR2(8), CONSTRAINT"PK_SYS_USER"PRIMARYKEY("USER_ID") );

该表中含有一条记录:

这就是我们的用于测试的单点登录的用户名和密码了,很简单吧?

全部保存后,重启tomcat,一切无误,然后我们打开一个ie,输入http://localhost:9090/cas-server会得到以下这个界面,那就说明你的cas sso已经安装成功了。

我们在用户名中输入sso, 在密码一栏中输入aaaaaa,然后看到下面这个界面,即代表我们的cas server和我们的数据库已经完全连上了。

如果我们不按照sys_user表中的用户名和密码就随意输入用户名和密码,那我们便会得到这样的结果:

将不同的工程连接上cas server以实现单点登录

按照这个图,我们将会有2个不同的war包

一个叫cas-sample-site1.war,它放在jboss里;一个叫cas-sample-site2.war,它放在jboss里; 我们在我们的eclipse里创建两个这样的war工程即可,这是非常简单的事,这2个工程都含有一个index.jsp文件。

cas-sample-site1

在它的index.jsp文件中含有如下内容:

[html]view plaincopy<%@pagelanguage="java"contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"> <title>cassamplesite1</title> </head> <body> <h1>cassamplesite1</h1> <ahref="http://localhost:8080/cas-sample-site2/index.jsp">cas-sample-site2</a> </br> <ahref="http://localhost:9090/cas-server/logout">退出</a> </body> </html>

cas-sample-site2

在它的index.jsp文件中含有如下内容:

[html]view plaincopy<%@pagelanguage="java"contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=utf-8"> <title>cassamplesite2</title> </head> <body> <h1>cassamplesite2</h1> <ahref="http://localhost:8080/cas-sample-site1/index.jsp">cas-sample-site1</a> </br> <ahref="http://localhost:9090/cas-server/logout">退出</a> </body> </html>

这两个war工程都有一个lib目录,确保它们的lib目录里都有这样几个jar

look, 注意要有cas-client-core-3.2.1.jar哦,它来自于:cas-client-3.2.1-release\cas-client-3.2.1\modulescas-client-3.2.1-release.zip解压出来的内容。

这两个工程的web.xml可以说是完全一模一样,我们来看:

[html]view plaincopy<?xmlversion="1.0"encoding="UTF-8"?> <web-appxmlns:xsi="/2001/XMLSchema-instance"xmlns="/xml/ns/javaee"xmlns:web="/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"version="2.5"> <display-name>cas-sample-site2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CASSingleSignOutFilter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CASSingleSignOutFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping> <filter> <filter-name>CASValidationFilter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <param-value>http://localhost:9090/cas-server</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param> <init-param> <param-name>useSession</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>redirectAfterValidation</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CASValidationFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping> <filter> <filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>http://localhost:9090/cas-server/login</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param> </filter> <filter-mapping> <filter-name>CASFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping> <filter> <filter-name>CASHttpServletRequestWrapperFilter</filter-name> <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> </filter> <filter-mapping> <filter-name>CASHttpServletRequestWrapperFilter</filter-name> <url-pattern>*</url-pattern> </filter-mapping> </web-app>

看到了没有,有这么一堆的listener和filter,而且它们一个不能漏,并且它们的顺序也是绝对不能够错的,一定要按照下面这个从上至下的顺序:

org.jasig.cas.client.session.SingleSignOutHttpSessionListener

org.jasig.cas.client.session.SingleSignOutFilter

org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

org.jasig.cas.client.authentication.AuthenticationFilter

org.jasig.cas.client.util.HttpServletRequestWrapperFilter 漏了一个,或者顺序错了,你将会发生下列情况: 可以正常登录,无法统一注销,即然是单点登录,那么我在任意一个站点上点“注销“是不是也因该是统一注销啊?可以登录,可以统一注销,但是拿不到cas-server上登录的用户的user session,如果我们是两个系统,那么这两个系统是不是都有web sesssion?较常用的就是user session,那么如果你的顺序配错了,或者是你漏配了一个,你是得不到cas-server上传过来的用户的一些登录信息的,这个很糟糕,这将会为我们后面的编程开发带来烦恼不能登录 至于为什么会得到这样的一些结果?

嘿嘿!

我们在后面的课程中会来分析cas 单点登录的源码(这个过程一点不变态,很简单的,一说就通,跟着我的教程一步步走不难的),在深入源码中后你就可以看出为什么这几个东西它们有严格意义上的顺序的关系了。

在这个web.xml文件里我们可以看到有两处出现了下面的这样的东西:

[html]view plaincopy<init-param> <param-name>casServerUrlPrefix</param-name> <param-value>http://localhost:9090/cas-server</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </init-param>

记住,上面的那行代表我们的cas server的服务器所在的地址,当用户用上面的cas-server的登录界面登录成功后,cas server 会自动跳回用户在ie地址里输入的子系统地址的首页。

如:我们先输入http://localhost:8080/cas-sample-site1,此时系统会先跳到http://localhost:9090/cas-server/login的画面要求用户先去做一次登录。

那么cas server它是怎么知道子系统地址的首页位于哪个地址(哪台服务器上)的呢,那么你要”注册“这个地址给cas server。

因此,第二行就是我们的具体的子系统的首页所在的地址。

这样的地方在我们的web.xml文件中一共出现了两处:

一处位于org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter一处位于org.jasig.cas.client.authentication.AuthenticationFilter 这2处如果没配好,你会遇到下列问题: 登录后无法正常跳回子系统的首页无法正常退出无法做系统间切换时的跳转 因此一定要注意啦!!!

我们把两个工程通过ECLIPSE布署在JBOSS7上,然后运行起来吧。

别忘了启动我们的Tomcat里的cas server哦。

全部启动完毕后我们在IE浏览器里输入:http://localhost:8080/cas-sample-site1

此时浏览器显示如下画面

我们在cas server的登录画面输入我们数据库表sys_user中的相应的用户名与密码后,再来看此时的浏览器它会跑到哪儿去?

点击cas-sample-site2这个链接呢?

然后点击“退出”这个链接

此时我们再在浏览器里输入:http://localhost:8080/cas-sample-site2--有时浏览器有缓存,它还是会显示cas-sample-site2的首页,这时你可以点一下F5或者是刷新按钮(这个可以通过代码来避免jsp或者是html页中使用缓存来做到)

look!

由于是统一注销,因此一旦注销,两个WEB都无法访问了,必须要求“统一登录一下”,于是我们再次输入用户名和密码

对不对。

好了,第一天不讲太多,从明天开始我们会依次开始讲:

1. 如何使用LDAP即模拟WINDOWS AD域的登录模式

2. 如何在不同的web工程间获取“统一登录”时的用户信息即userprincipal

3. 如何改造CAS SSO自带的登录界面

4. 如何使得我们的CAS SSO可以支持类似于淘宝这种“多租户”的概念

上面说到了CAS SSO最基本的使用方法,并且我们结合了一个数据库表来实现了我们自定义用户名和密码的单点登录功能。今天我们将要开始把我们的CAS SSO一步步往更深更专业的层次推进下去,我们先来看一下CAS SSO在结合WINDOWS AD域(此处我们使用open-ldap)来实现这个WINDOWS AD域的单点登录。即如何把我们的单点登录和巳有域帐号进行一下结合。

安装openldap

我们首先需要安装一个openldap,考虑到大部分读者还是以Windows操作系统为主,因此我们还是安装一个openldap for windows吧,网上很多openldap写着for windows但其实都不是真正的for windows,而是一些个自解压包或者是linux下的openldap的src文件在windows下用c++编译器重新编译了一下,这样的openldap会存在的诸多的不稳定性如: 服务莫明奇妙的当机openldap损坏,数据发生了无可逆转的破坏 我们还是去官方下载一个专门为windows定制的openldap吧,这个版本目前为止也是我使用下来觉得最稳定的版本,从没死过机,当然我回头也会把相关的安装文件传在我的资源中为大家提供便利。

大家以后装软件尽量不要把东西都装在C盘或者是什么program files这种形式的目录内,因为java的一些软件对于空格、特殊字符很敏感,曾经碰到过一些生产环境上出问题,结果查了半天是因为JAVA不认一些特殊字符导致的无法预料的错误,一旦你碰到了这种错误,嘿嘿,那就不只是找1-2小时的问题了,所以大家请养成一个好的习惯。

安装软件时请一定clear and sharp, clear and sharp。

可以从上图中看出openldap有2个端口: 389即通用端口636即加密通讯端口,也就是openldaps(openldap里的ssl传输) 下一步。

在这儿我们选择BDB,即openldap自带的berkeley db,它是一个嵌入式的数据库,openldap的一些存储依赖于这个选项。

这儿设置的你们可以认为就是openldap里的“数据库超级用户密码”,我们就简单点,保持其default值叫"secret"即可。

全都设置完后openldap for windows就开始安装了。它装完后会自动在windows的服务器安装一个openldap的service,以便于开机自启动。

我们先不要去启动它,因为openldap刚装完后只是一个光版,我们还需要给它一些最基本的设置。

设置openldap

找到我们的openldap安装位置,用纯文本编辑器打开D:\utility\OpenLDAP目录下的slapd.conf文件。

[html]view plaincopyinclude./schema/core.schema include./schema/cosine.schema include./schema/nis.schema include./schema/inetorgperson.schema include./schema/openldap.schema include./schema/dyngroup.schema

确保这几行include都不会注释即放开状态,所谓注释状态即如下形式:[html]view plaincopy#include./schema/core.schema

因为这些是openldap的”依赖库“文件。

接着我们继续往下找,找到下面这行:

[html]view plaincopysuffix"dc=maxcrc,dc=com" rootdn"cn=Manager,dc=maxcrc,dc=com"

这是什么意思?

openldap用的是和windows ad域一样的协议,它就是一个万维网的地址格式,如/video/animate,这一个个的”/”就是ldap即目录域形式,它是按照目录格式一级级向下寻找的,因此它相对于关系性数据库来说显得更轻量更快。

在这儿:

suffix即代表“数据库地址”大家也可以把它想成urlrootdn即用户名密码?那就是刚才我们设的secret 这个是openldap安装完后默认的一个连接地址和用户名,当然我们不希望延用它的默认值,我们一般都会做一些自己个性化的设置,来,我们下面来改变一下这两行内容的值。

[html]view plaincopysuffix"dc=sky,dc=org" rootdn"cn=Manager,dc=sky,dc=org"

我们把我们的域的根地址改成,那么在openldap中的表现就是dc=sky,dc=org,如果说对于这个根有一个用户,那么这个用户就一定是对于/xxx/xxx/xxx下所有目录具有访问权限的一个用户了,对不对,所以说这个dc=sky,dc=org的用户就是一个超级用户。

在openldap中用户名的格式是要写全的,因此我们把rootdn也改成了“cn=Manager,dc=sky,dc=org”,这么一长串就是它的用户名了。

再比如说:我们有一个用户,只限定该用户可以访问/company/companya下面的任何东西,那么这时这个用户名的dn该怎么写呢:

cn=sampleuser1,ou=companya,o=company,dc=sky,dc=org

看到了吗?

大家根据上面这个形式去找找感觉看,至于o代表什么意思? ou? dc? 这些都是ldap协议中的专有“属性”,好比是数据库内的字段类型,这个不属于本教程讨论范围,网上这方面资料太多,以后我会在讲ldap或者是ad域时专门讲述这些内容的。

上面我们设好了suffix,设好了rootdn,保存该文件后我们就可以启动openldap的服务了。

服务启动了,怎么连接openldap?怎么管理?

很可惜,openldap默认不提供图形化客户端,都是以黑屏命令形式连上openldap然后以命令形式来进行相关的用户和组织的增删改查的,当然我们有第三方开源工具可以对openldap进行管理。

openldap的管理

我们使用LdapAdmin工具,它是一个for windows的图形化管理openldap的客户工具,不需要安装,直接下载后双击即可使用,相当的灵活,它轻便、灵活而且是一个开源免费的软件。

双击它即可启动。

启动后选择菜单里的start->connect...即会弹出上面这个界面

我们选择New connection这个选项,双击New connection即得到下面这个界面。

大家可以把这个界面就认为是数据库超级用户的管理界面啦。

现在,我们开始填入相应的参数进去:

大家看这边的Base,就是suffix,如果你不想输这个Base或者是忘记了我们在slapd.conf文件中设置的suffix,你也可以点一下这个【Fetch DNs】按钮,它会根据主机地址和端口号自动探测到该服务器上的openldap服务及所有的suffix,并为你自动填上。

当然,我们不希望匿名登录,这样太不安全了,因此我们不是才设了rootdn和password吗?

于是我们把【Anonymous connection】前的勾取消掉,然后在Username中填入我们的rootdn,Password中填入“secret”。

按【Test connection】,我们得到“Connection successful”提示,即代表我们已经可以连上openldap服务了,此时请点【OK】按钮。

look,我们有了一个自己的“连接”叫localhost,双击它试试呢?

可以看到,此时,它还是一个空的“数据库”即没有建任何的“database instance(数据库实例)”,我们需要建一个database后才可以进行使用。

openldap的database的建立也有着它自己的create database命令,只不过它是一种叫ldif的批指令格式,我们只需要建立一个database,因此我们尽量简化我们的ldif命令,我们把它称为:root.ldif吧,该文件内容如下:

[plain]view plaincopydn:o=company,dc=sky,dc=org objectClass:organization o:company dn:ou=members,o=company,dc=sky,dc=org objectClass:organizationalUnit ou:members

我们把它存为root.ldif文件,然后在我们的LdapAdmin界面中如下操作:

选择我们刚才建立的root.ldif文件,并且点【OK】按钮

看,我们已经有了自己的openldap“数据库”了。

建立openldap中的用户

我们有了数据库就可以往数据库中插数据了,我们来建一个用户名叫user1,密码为6个a吧。

右键单击ou=member这个树叶,按照如下界面来操作吧。

注意上面有几个地方要选择的: Rdn即rootdn,我们填入cn=user1在Objectclass即字段类型中我们通过下拉框选择organizationPerson这个organizationPerson有3个属性是必须要填的: cn即用户名sn即缩写还有就是userPassword(按右边的滚动条往下拉可以看到这个属性 右边凡是黑色加粗的为“必填”项。

全部填完后即可按下【Save】按钮。

看,我们在我们的openldap中增加了一项,此时我们对于:

ou=members,o=company,dc=sky,dc=org这条url的访问用的用户名那因该怎么写呢:

dn: cn=users1,ou=members,o=company,dc=sky,dc=orgpassword: aaaaaa

对吧?很简单的哦,多练练就熟悉了。

好了,我们在openldap中建立了用户名和密码,现在就是要把我们的CAS SSO和我们的OpenLdap结合起来,即CAS SSO单点登录中的用户名从原来的数据库改变为ldap里的用户名和密码了。

在此之前,我们先普及一下相关的LDAP的理论知识。

OpenLdap VS 数据库

LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP 之上的访问协议—LDAP。因此LDAP协议存储和访问数据比数据库的效率要高的多的多

LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。常见的例子是通讯簿,由以字母顺序排列的名字、地址和电话号码组成

目录服务与关系数据库之间的主要区别在于二者都允许对存储数据进行访问,只是目录主要用于读取,其查询的效率很高,而关系数据库则是为读写而设计的。也就是目录服务不适于进行频繁的更新,属于典型的分布式结构。

总结:对于查询操作多于更新操作的(认证)系统来说,使用OpenLDAP是一个比关系数据库如MySq、PostgreSQL等更好的选择

配置CAS SSO结合LDAP

拷入相应的jar类。

我们需要用到以下这些类库,把它们加载到D:\tomcat\webapps\cas-server\WEB-INF\lib目录下。 cas-server-support-ldap-3.5.2.jar(在cas-server3.5.2的modules目录下去找到该包)

spring-context-3.1.0.RELEASE.jar

spring-context-support-3.1.0.RELEASE.jar

spring-ldap-core-1.3.0.RELEASE.jar

spring-ldap-core-tiger-1.3.0.RELEASE.jar

spring-context-3.1.0.RELEASE.jar

spring-context-support-3.1.0.RELEASE.jar

spring-binding-2.3.0.RELEASE.jar

当然,我会把我集成好的cas-server-ldap一起上传在我的资源中,以便于大家的学习和使用。

把类库准备好后,我们开始来编辑我们的配置文件了。

配置ldap数据源

打开D:\tomcat\webapps\cas-server\WEB-INF目录下的deployerConfigContext.xml文件

找到我们原来的数据库数据源即dataSource[html]view plaincopy<beanid="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <propertyname="driverClassName"value="oracle.jdbc.OracleDriver"/> <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/> <propertyname="username"value="ymk"/> <propertyname="password"value="password_1"/> </bean>

我们把它注释掉。

[html]view plaincopy<!--jdbcdatasource--> <!-- <beanid="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <propertyname="driverClassName"value="oracle.jdbc.OracleDriver"/> <propertyname="url"value="jdbc:oracle:thin:@localhost:1521:orcl"/> <propertyname="username"value="ymk"/> <propertyname="password"value="password_1"/> </bean> --> 然后加入一段:[html]view plaincopy<!--ldapdatasource--> <beanid="contextSource"class="org.springframework.ldap.core.support.LdapContextSource"> <propertyname="password"value="secret"/> <propertyname="pooled"value="true"/> <propertyname="url"value="ldap://localhost:389"/> <!--管理员--> <propertyname="userDn"value="cn=Manager,dc=sky,dc=org"/> <propertyname="baseEnvironmentProperties"> <map> <!--Threesecondsisaneternitytousers.--> <entrykey="com.sun.jndi.ldap.connect.timeout"value="60"/> <entrykey="com.sun.jndi.ldap.read.timeout"value="60"/> <entrykey="java.naming.security.authentication"value="simple"/> </map> </property> </bean>

这就是我们的LDAP连接数据源了。

这边需要注意的是以下几个地方: property name="password"property name="url"property name="userDn" 然后我们找到我们在第一天教程中配置jdbc handler的地方:[html]view plaincopy<beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <propertyname="dataSource"ref="dataSource"></property> <propertyname="sql"value="selectpasswordfromsys_userwhereuser_id=?"></property> </bean> 把这段注释掉[html]view plaincopy<!--jdbchandler--> <!-- <beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <propertyname="dataSource"ref="dataSource"></property> <propertyname="sql"value="selectpasswordfromsys_userwhereuser_id=?"></property> </bean> --> 加入一段:[html]view plaincopy<!--ldaphandler--> <beanclass="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler"> <propertyname="filter"value="cn=%u"/> <!--基节点--> <propertyname="searchBase"value="ou=members,o=company,dc=sky,dc=org"/> <propertyname="contextSource"ref="contextSource"/> </bean>

保存并存盘。

需要注意的是下面这两行: <property name="filter" value="cn=%u" />

<property name="searchBase" value="ou=members,o=company,dc=sky,dc=org" />

还记得之前我们说过的,LDAP里是怎么寻找cn=user1的连接地址的吗?

cn=user1,ou=members,o=company,dc=sky,dc=org

所以,在这儿,我们以ou=members,o=company,dc=sky,dc=org为基本地址(searchbase),寻找下面一切cn=为开头的用户名是否匹配(filter),如果用户名匹配了,那么cas会自动从LDAP里把该用户的userDn取出来,同时问你索取该用户所绑定的相关密码。

cas sso就是这么和ldap结合起来的。

好了,我们的LDAP和我们的CAS SSO已经结合好了,来做实验吧。

打开一个IE,输入:http://localhost:9090/cas-server/login

得到上面这个界面,然后我们在用户名和密码中输入相应的用户名和密码:

点击【登录】按钮,得到登录成功画面

这说明我们的CAS + LDAP是结合成功了,为了进一步实验我使用LdapAdmin工具再加入一个用户名:

username="cn=user2"password="abcdefg"

然后我们拿cn=user2来做一下实验吧。

点击【登录】按钮,得到登录成功画面

这是我们需要的效果。

现在我们来拿我们在第一天中的cas-sample-site1和cas-sample-site2这两个Web App来做实验吧。

把这2个实验工程启动起来,然后我们打开一个IE,输入:http://localhost:8080/cas-sample-site1,IE跳转到了我们的cas-server的单点登录画面:

输入user1/aaaaaa或者是user2/abcdefg后,我们得到如下画面

点击“注销”连接,关闭IE,然后我们打开一个IE,输入:http://localhost:8080/cas-sample-site2,随后我们在登录界面输入user1/aaaaaa或者是user2/abcdefg后,我们得到如下画面

以上就是我们要的结果。

cas-server和ldap的集成完后的case-server-ldap我已经上传在了我的资源中了,下载网址在:cas-server-ldap。

LdapAdmin客户端的下载网址在此:LdapAdmin。

Openldap for Windows稳定版下载在此:openldap for windows稳定版

OK,结束我们第二天的教程,下次开始我们要深入了解在使用cas sso登录后我们的Web应用是如何去取到用户的登录信息。

比如说我们的用户的信息像email, 手机, 姓名, 公司, 部门都是保存在ldap协议中的(如下截图)

【博主在网上找的资料,以后还会继续完美】

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。