原文地址:http://blog.csdn.net/danruoshui315/article/details/47775325
最近公司让我研究cas单点登录,经过一周多的研究终于做出了demo,为了方便自己以后查看也为了给需要的人提供帮助,我决定写成博客。
首先对于单点登录的原理需要有大致的了解,原理网上的帖子很多,我大致说下:
CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
CAS Server主要负责用户名密码等的认证工作。
由于cas既可以使用https协议也可以使用http协议,由于没有特殊要求故本人选择了http请求做实例分析。
第一步:从官网下载最新版本的casServer和casClinet,地址:
https://www.apereo.org/projects/cas/download-cas
我使用的版本是cas-server-4.0.0和cas-client-3.3.3以eclipse工具为例。
第二步:复制三份tomcat,分别为tomcat-server和tomcat-client1、tomcat-client2
第二步;解压下载下来的服务端和客户端,将cas-server-4.0.0\modules下的cas-server-webapp-4.0.0.war复制到tomcat-server下的webapps,启动tomcat(tomcat/bin/startup.bat),输入:http://localhost:8080/cas-server-4.0.0默认会跳转到登陆页面,这里说明一下,使用cas-server3.3.3版本认证的方法是:
org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler
此方法默认用户名密码一致就可以登录,但是4.0以后版本默认认证方式变了,变为:
org.jasig.cas.authentication.AcceptUsersAuthenticationHandler
用户名和密码是写死的,用户名是:casuser,密码是:Mellon
配置认证方式的配置文件为:cas-server\Webapp\WEB-INF\deployerConfigContext.xml
第三步:在eclipse中新建一个web工程,名字为cas-server,将tomcat-server\webapps\cas-server-4.0.0\WEB-INF\classes下面的所有文件全部复制到工程的src下面,将WEB-INF下面的别的内容复制到webapp下,将之前tomcat目录下的webapps的war包和解压的内容删除。
第四步:配置客户端
修改tomcat-client1和tomcat-client2端口号,分别修改的地方为:
<Server port="8005" shutdown="SHUTDOWN">
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
端口号随意只要不和原来的默认的相同就行
第五步:eclipse中新建两个客户端demo和demo1(都是web工程),复制cas-client-3.3.3\modules下面所有jar包到
工程的lib目录下
第六步:修改web.xml文件,添加如下内容:
<!-- 单点登录配置开始 -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</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:8080/cas-server/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- 项目所在服务器IP+PORT -->
<param-value>http://localhost:8081</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<!--这里是服务端的项目名称 -->
<param-value>http://localhost:8080/cas-server</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!-- 项目所在服务器IP+PORT -->
<param-value>http://localhost:8081</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。-->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
index.jsp页面添加如下内容:
客户端1和2配置完全相同,将之前新建的三个tomcat添加进来,将三个工程分别添加进tomcat中,启动tomcat,
浏览器输入:http://localhost:修改的客户端端口号/项目名称
,因为配置了cas就会自动跳转至服务器的登录页面,输入用户名密码即可登录,登录完成后就又会返回到客户端1,点击进入客户端2会发现无需再次登录即可直接访问客户端2
第七步:使用数据库验证用户名密码:
deployerConfigContext.xml里注释掉默认的验证方式primaryAuthenticationHandler添加我们自己的通过数据库匹配的验证方式
至此,单点登录完整的demo算是成功了,但是还有一点小小问题需要说明下,网上曾经有人说将cas-servlet.xml中的p:followServiceRedirects里的false改为true,即可使用logout输入service参数为自己设置的退出页面,千万不要这样设置,这样设置后无法退出我亲自试验过,加参数只需要像我的index.jsp页面那样直接后缀加上:
?service=http://localhost:8081/demo/index.jsp即可。
以下是此文章写好的demo,需要的可自行下载
http://download.csdn.net/detail/danruoshui315/9052885
http://download.csdn.net/detail/danruoshui315/9053055