`
dinguangx
  • 浏览: 244764 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CAS服务器实验之四:单点登录测试

    博客分类:
  • CAS
CAS 
阅读更多

客户端应用创建

新建一动态web工程cas-client1,这里使用的是maven来创建,在pom文件中增加对cas-client的依赖。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.dylan</groupId>
	<artifactId>cas-client1</artifactId>
	<version>1.0-SNAPSHOT</version>
	<packaging>war</packaging>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>3.1.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.jasig.cas</groupId>
			<artifactId>cas-client-core</artifactId>
			<version>3.1.10</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>tomcat-maven-plugin</artifactId>
				<configuration>
					<port>8081</port>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

 

Web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="cas-client1" version="2.5">
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:applicationContext-cas.xml</param-value>
	</context-param>
	<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
	<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>CAS Authentication Filter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>authenticationFilter</param-value>
		</init-param>
	</filter>
	<filter>
		<filter-name>CAS Validation Filter</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
		<init-param>
			<param-name>targetBeanName</param-name>
			<param-value>ticketValidationFilter</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>CAS Authentication Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<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>
	<!-- 自定义的filter,在用户登录成功之后进行处理 -->
	<filter>
		<filter-name>AutoSetUserAdapterFilter</filter-name>
		<filter-class>org.dylan.sso.filter.AutoSetUserAdapterFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>AutoSetUserAdapterFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!--       - Loads the root application context of this web app at startup. 
		      - The application context is then available via       - WebApplicationContextUtils.getWebApplicationContext(servletContext). 
		     -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
</web-app>

 

Spring配置文件

 

web.xml中可以看出,这里使用了springDelegatingFilterProxycasfilter进行代理,这样做的好处是将casspring集成起来,方便对配置信息的管理。也更符合主流的编程风格。所以这里还用到了一个spring的配置文件和属性的配置文件。

applicationContext-cas.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       ">
	<context:property-placeholder location="classpath:cas-client.properties" />
	<bean name="authenticationFilter"
		class="org.jasig.cas.client.authentication.AuthenticationFilter">
		<property name="casServerLoginUrl" value="${cas.server.loginUrl}" />
		<property name="renew" value="${cas.server.renew}" />
		<property name="gateway" value="${cas.server.gateway}" />
		<property name="service" value="${cas.client.serverName}" />
	</bean>

	<!-- 对认证ticket进行校验 -->
	<bean name="ticketValidationFilter"
		class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter">
		<property name="service" value="${cas.client.serverName}" />
		<property name="ticketValidator">
			<bean class="org.jasig.cas.client.validation.Cas10TicketValidator">
				<constructor-arg index="0" value="${cas.server.url}" />
			</bean>
		</property>
	</bean>

</beans>

 

cas-client.properties

cas.server.url=http://localhost:8080/cas/
cas.server.loginUrl=http://localhost:8080/cas/login
cas.server.renew=false
cas.server.gateway=false
cas.client.serverName=http://localhost:8081/cas-client1/

 

这里的配置信息根据实际的情况进行修改,我这里的cas服务器的地址是http://localhost:8080/cas,当前客户端的服务地址是http://localhost:8081/cas-client1(通过pom文件中可以看到使用的端口号)

AutoSetUserAdapterFilter

该类的doFilter方法如下(详细说明见后文中的参考资料):

/**
	 * 过滤逻辑:首先判断单点登录的账户是否已经存在本系统中, 如果不存在使用用户查询接口查询出用户对象并设置在Session中
	 * 
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;

		// _const_cas_assertion_是CAS中存放登录用户名的session标志
		Object object = httpRequest.getSession().getAttribute(
				AbstractCasFilter.CONST_CAS_ASSERTION);
		if (object != null) {
			Assertion assertion = (Assertion) object;
			String loginName = assertion.getPrincipal().getName();
			System.out.println("用户已经在SSO系统中登录,登录用户名为:" + loginName);
			String user = getCurrentUser(httpRequest);

			// 第一次登录系统
			if (user == null) {
				System.out.println("用户第一次登录系统,保存session信息.");
				httpRequest.getSession().setAttribute("User_Info", loginName);
			} else {
				System.out.println("当前Session中的用户信息为:" + user);
			}

		}
		chain.doFilter(request, response);
	}

	private String getCurrentUser(HttpServletRequest request) {
		return (String) request.getSession().getAttribute("User_Info");
	}

 

客户端页面index.jsp

%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	首页,当前登录用户是:<%=session.getAttribute("User_Info") %>
</body>
</html>

 

由于在web.xml中对安全的拦截配置为/*,所以该页面是受保护的,需要用户输入用户名和密码才能使用。

 

为了测试单点登录在多个应用程序间是否生效,将上面创建的cas-client1复制一份,更名为cas-client2,并将pom文件中tomcat使用的端口配置为8082;并相应地修改cas-client.properties文件中的客户端配置。

 

现在,依次启动cas-servercas-client1cas-client2三个应用。

测试

 

在浏览器中输入地址:http://localhost:8081/cas-client1/index.jsp,可以看到,浏览器已经自动跳转到cas-server的登录页面,如下图:



 

 

输入用户名和密码,登录成功。浏览器又会返回到cas-client1的首页,如下图:



 

此时,在浏览器中打开一个选项卡(由于cas-server默认的cookie是当前窗口,所以不能是再打开一个新窗口测试),输入cas-client2的访问地址:http://localhost:8082/cas-client2/index.jsp。此时,看到用户已经登录,并获取到用户的登录名。如下图:



 

单点登录测试成功。

  • 大小: 34.7 KB
  • 大小: 8.2 KB
  • 大小: 9.3 KB
分享到:
评论
5 楼 YY008871 2013-07-16  
wuliaolll 写道
是不是还要设置证书的路径,我这边服务端验证成功后报错



javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

是的,要在cas服务器中设置证书路径。
4 楼 wuliaolll 2013-04-18  
是有所启发,入门教程不错,但深入太少了,重点是服务端的各项配置,因为我看你的博文全是讲客户端的。希望有服务端的教程,分布式sso,当然客户端关于多平台(语言)之间的通信协议规范也很重要。
3 楼 dinguangx 2013-04-17  
wuliaolll 写道
是不是还要设置证书的路径,我这边服务端验证成功后报错



javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我没对HTTPS方式进行测试,因为单位不具备HTTPS的条件,你可以把我这个系列的所有文章都看一下,看是不是有收获
2 楼 wuliaolll 2013-04-17  
当然我是测的ssl
1 楼 wuliaolll 2013-04-17  
是不是还要设置证书的路径,我这边服务端验证成功后报错



javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

相关推荐

    cas 单点登录 解决方案.

    cas 单点登录解决方案是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。随着企业的发展,业务系统的数量在不断增加,老的系统却...

    基于Cas的单点登录实现

    **基于Cas的单点登录实现** 单点登录(Single Sign-On,简称SSO)是一种在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的技术。它为用户提供了一种方便、高效的访问多系统的方式,同时减少...

    集成cas实现单点登录认证.zip

    在IT行业中,单点登录...总的来说,"集成cas实现单点登录认证.zip"提供的资源将指导你完成整个SSO集成过程,从安装CAS服务器到配置若依应用,再到解决可能遇到的问题,帮助你构建一个安全、便捷的单点登录环境。

    CAS单点登录之测试应用

    标题中的"CAS单点登录"是指Central Authentication ...总之,"CAS单点登录之测试应用"这篇文章会是一篇详实的技术分享,涵盖了从理论到实践的多个方面,旨在帮助读者掌握如何在实际环境中部署和测试CAS单点登录系统。

    CAS单点登录服务器配置详情

    ### CAS单点登录服务器配置详解 #### 一、CAS单点登录概述 CAS(Central Authentication Service)是一种开放源代码的单点登录协议和服务框架,它为Web应用提供了一种简化了的身份验证流程。通过CAS,用户只需要在...

    用cas实现mantis单点登录和登出

    ### 使用 CAS 实现 Mantis 单点登录与登出 #### 概述 单点登录(Single Sign-On,简称 SSO)是一种常见的身份认证模式,它允许用户在多个应用程序和服务中仅通过一次登录就能访问所有相关系统而无需多次输入密码。...

    cas单点登录测试配置

    在本“cas单点登录测试配置”项目中,我们将探讨如何在Tomcat服务器上设置CAS服务器和客户端。Tomcat是一个流行的开源Java Servlet容器,常用于部署Web应用程序。 1. **CAS服务器配置**: - 首先,你需要下载并...

    cas单点登录自己写的测试例子

    在这个“cas单点登录自己写的测试例子”中,开发者提供了一个包含客户端和服务器端的完整示例,旨在帮助理解并实践CAS SSO机制。这个项目使用Maven作为构建工具,方便管理和依赖的解决。 首先,我们来看一下CAS的...

    CAS多数据库配置单点登录

    四、CAS单点登录原理 CAS单点登录的原理是基于Ticket机制的。下面将详细介绍CAS单点登录的原理: 1. 用户请求资源 当用户请求资源时,客户端会将用户重定向到CAS服务器端,进行身份验证。 2. CAS服务器端认证 ...

    CAS单点登录系统之java实现(part_1)

    资源列表(1:cas CAS Server,2:Cas_Client_One 授权系统,3:graduationDesign 用户组织管理系统,4:CAS单点登录论文.doc,5:CAS单点登录文献综述.doc,6:基于CAS的用户管理单点登录门户系统ppt.ppt)

    单点登录cas服务器demo及springboot客户端demo

    总结起来,这个"单点登录cas服务器demo及springboot客户端demo"项目提供了一个实践单点登录概念的实例,涵盖了CAS服务器的搭建、Spring Boot应用的CAS客户端集成,以及Shiro或Pac4j的使用。对于想要学习和理解SSO...

    CAS单点登录demo

    在本“CAS单点登录demo”中,我们将深入探讨CAS的工作原理、配置步骤以及如何实现客户端与服务器端的交互。 1. CAS工作原理: CAS的核心思想是集中式的身份验证,用户只需在一个地方进行登录,之后访问其他已经...

    CAS5.3+windows AD域实现单点登录免身份认证.docx

    CAS 5.3 及 Windows AD 域实现单点登录免身份认证 CAS(Central Authentication Service)是一种流行的开源身份验证系统,旨在提供单点登录(SSO)解决方案。Windows AD(Active Directory)则是微软公司推出的目录...

    CAS单点登录配置

    CAS(Central Authentication Service,中央认证服务)是一种广泛使用的开源单点登录(Single Sign-On, SSO)系统,它允许用户通过一个入口点登录,然后在多个应用之间无缝切换,而无需再次验证身份。CAS的目的是...

    落雨博客基于CAS框架的单点登录技术讲解(ppt+code实例+doc)配套资料

    [置顶] SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析 http://blog.csdn.net/ae6623/article/details/8848107 目 录 1 引言 4 1.1 摘要 4 1.2 范围 4 1.3 读者对象 4 1.4 关键词 4 2 ...

    cas .net单点登录

    总之,CAS .NET单点登录示例提供了在.NET环境中集成CAS服务器的方法,使多个应用能共享同一个登录状态,提高用户的安全性和便利性。通过以上步骤,开发者可以快速地在.NET应用中实现CAS单点登录功能。

    struts2+cas单点登陆例子

    在这个例子中,我们将深入探讨如何在MyEclipse环境下使用Struts2框架与CAS服务器配合,实现单点登录功能。 首先,让我们理解一下CAS(Central Authentication Service)的核心概念。CAS是一个开放源码的SSO解决方案...

    cas单点登录

    单点登录的核心在于一个中心认证服务器(CAS Server)和各个需要认证的应用系统。当用户首次尝试访问受保护的应用时,会被重定向到CAS Server进行身份验证。如果用户通过验证,CAS Server会生成一个服务票据...

    单点登录CAS资料

    单点登录(Single Sign-On,简称SSO)是一种网络用户身份验证的机制,它允许用户在一次登录后,访问多个相互关联的应用系统而无需再次进行身份验证。CAS(Central Authentication Service,中央认证服务)是SSO的一...

    单点登录cas3.5.6版本资源

    单点登录(Single Sign-On, SSO)是一种网络认证机制,允许用户在一次登录后,无需再次认证即可访问多个相互信任的应用系统。CAS(Central Authentication Service)是Java开发的一个开源SSO项目,它提供了一种统一...

Global site tag (gtag.js) - Google Analytics