`

CAS实现单点登录(SSO)完整步骤

 
阅读更多
教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤

生成证书前需要配置证书:



1、生成证书
用JDK自带的keytool工具生成证书:
D盘下创建keys文件,不需要创建hailong
命令:keytool -genkey -alias(别名)hailong -keyalg RSA -keystore D:/keys/hailong 



hailong 是证书别名
2、导出证书
命令:C:\>keytool -export -file d:/keys/hailongCRT.crt -alias hailong(别名要一致) -keystore d:/keys/hailong


.crt密钥文件

3、把证书导入到客户端JDK中。
命令:keytool -import -keystore D:\software\jdk\java1.7\jdk1.7.0_79\jre\lib\security\cacerts -file D:/keys/hailongCRT.crt -alias hailong


如果出现以下错误,把...jdk1.7.0_79\jre\lib\security下的cacerts文件删除掉,在执行。
eytool错误: java.io.IOException: Keystore was tampered with, or password was incorrect
 

4、配置服务端
下载CAS的服务端,解压,把解压后的文件中文件夹中的cas-server-webapp-3.4.8.war文件拷贝的apache-tomcat-7.0.73\webapps下,并修改文件名为:cas.war。


2、修改apache-tomcat-7.0.73\conf\server.xml文件,去掉此文件83到93行之间的注释,修改为:


5、启动tomcat
账号 admin,密码 admin 默认账号和密码一样就行


配置host域名,用https访问 https://sso.wsria.com:8443/cas
具体链接 http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
http://liujiawinds.iteye.com/blog/1990715

cas客户端配置
<!-- pom.xml-->
<dependency>
	<groupId>org.jasig.cas.client</groupId>
	<artifactId>cas-client-core</artifactId>
	<version>3.1.12</version>
</dependency>

<!-- ======================== 单点登录开始 ======================== -->  
    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->  
    <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>https://www.hailongsso.com:8443/cas/login</param-value>
            <!--这里的server是服务端的IP,点单登录地址链接 -->  
        </init-param>  
        <init-param>  
            <param-name>serverName</param-name>  
            <param-value>http://www.hailongsso.com:8081</param-value><span style="color:#FF0000;"> ①</span>  
            <!--登录后的客户链接地址 -->  
        </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>https://www.hailongsso.com:8443/cas</param-value>  
        </init-param>  
        <init-param>  
            <param-name>serverName</param-name>  
            <param-value>http://www.hailongsso.com:8081</param-value>  <span style="color:#FF0000;">②</span>  
        </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>  

    <!-- ======================== 单点登录结束 ======================== -->  

输入客户端地址 http://www.hailongsso.com:8081/SingleSignOnExample
重定向到cas单点登录画面


拦截认证的AuthenticationFilter.java具体分析
public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        final HttpServletRequest request = (HttpServletRequest) servletRequest;
        final HttpServletResponse response = (HttpServletResponse) servletResponse;
        //TGC Cookie传过来了,验证一下是不是其生成的,如果是,那我用TGT签发一个ST,redirect给浏览器
        //session 对应 TGC Cookie 三次进入 null 有值 有值
        // 第一次来,没有TGC Cookie,客户端输入账号密码后去cas才能有
        final HttpSession session = request.getSession(false);
        //assertion 对应ST 三次进入 null null  有值
        // 第二次来,没有ST,第三次进来去CAS申请后才有值。
        final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;

        if (assertion != null) {
            filterChain.doFilter(request, response);
            return;
        }

        final String serviceUrl = constructServiceUrl(request, response);
        final String ticket = CommonUtils.safeGetParameter(request,getArtifactParameterName());
        final boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);

        if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {
            filterChain.doFilter(request, response);
            return;
        }

        final String modifiedServiceUrl;

        log.debug("no ticket and no assertion found");
        if (this.gateway) {
            log.debug("setting gateway attribute in session");
            modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);
        } else {
            modifiedServiceUrl = serviceUrl;
        }

        if (log.isDebugEnabled()) {
            log.debug("Constructed service url: " + modifiedServiceUrl);
        }

        final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);

        if (log.isDebugEnabled()) {
            log.debug("redirecting to \"" + urlToRedirectTo + "\"");
        }

        response.sendRedirect(urlToRedirectTo);
    }

对于cas客户端的认证和拦截配置到具体的业务服务项目里,对认证拦截可以有自定义的规则,重写或替换AuthenticationFilter.java等类。

修改CAS的认证逻辑
CAS默认的逻辑是用户名和密码一致就可以登陆,现在需要把原web系统的用户名和密码校验挪到CAS中。这里假设原先web系统中有一张sys_user表存储了用户名和MD5散列后的密码。

打开cas/WEB-INF/deployerConfigContext.xml
注释掉SimpleTestUsernamePasswordAuthenticationHandler这个Handler,并添加
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
	<property ref="dataSource" name="dataSource"></property>
	<property name="sql" value="select t.encrypted_user_password from sys_user t where t.user_name=?"></property>                     
	<property ref="MD5PasswordEncoder" name="passwordEncoder"></property>
</bean>


在文件末尾之前加入数据库的链接:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
            <value>jdbc:oracle:thin:@yourIP:1521:yourOracleInstanceId</value>
        </property>
        <property name="username">
            <value>yourName</value>
        </property>
        <property name="password">
            <value>yourPassword</value>
        </property>
    </bean>
    <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
        <constructor-arg index="0">
            <value>MD5</value>
        </constructor-arg>
    </bean>

cas加入jdbc支持
复制cas-server-3.5.2\modules\cas-server-support-jdbc-3.5.2.jar和oracle驱动(这里采用oracle数据)的ojdbc14.jar或者classes12.jar放到cas/WEB-INF/lib目录下。

cas-server-webapp源码打包cas-server-webapp.war修改成cas.war
就是以上所说服务的war包:



  • 大小: 58.5 KB
  • 大小: 52.8 KB
  • 大小: 92.5 KB
  • 大小: 99.1 KB
  • 大小: 119.1 KB
  • 大小: 45.3 KB
  • 大小: 46.2 KB
  • 大小: 38.8 KB
  • 大小: 65.6 KB
  • 大小: 35.3 KB
  • 大小: 57.2 KB
  • 大小: 101 KB
  • 大小: 58.1 KB
  • 大小: 23.9 KB
分享到:
评论

相关推荐

    【转载】CAS实现单点登录(SSO)经典完整教程

    CAS(Central Authentication Service)是一种广泛使用的开放源码的单点登录(Single ...在提供的文档《手把手教你利用CAS实现单点登录.docx》中,你将找到更详细的步骤和示例代码,帮助你更好地理解和实施CAS SSO。

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

    本压缩包"集成cas实现单点登录认证.zip"显然包含了关于如何使用CAS(Central Authentication Service)框架集成SSO认证的资源。下面我们将详细探讨相关的知识点。 1. CAS简介:CAS是耶鲁大学开源的一个Web应用的...

    CAS单点登录(SSO)教程

    ### CAS单点登录(SSO)教程详解 #### 前言 随着企业信息化建设的不断发展,用户需要在多个系统之间切换并重复登录的情况越来越常见,这不仅降低了用户体验,还增加了管理成本。为了解决这一问题,单点登录(Single ...

    基于Cas的单点登录实现

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

    CAS单点登录实例详细步骤

    通过上述步骤,我们不仅了解了CAS单点登录的基本原理,还掌握了如何利用`keytool`工具生成、导出和导入证书,以及如何在Tomcat服务器上配置SSL以实现安全的数据传输。CAS SSO配置虽然看似复杂,但遵循正确的步骤并...

    discuz x2.5和cas集成,实现cas单点登录 sso

    X2.5与CAS(Central Authentication Service)集成是一种常见的身份验证解决方案,它能够实现单点登录(Single Sign-On, SSO)功能。在SSO系统中,用户只需登录一次,就可以在多个相互独立的应用系统之间自由切换,...

    CAS单点登录(SSO)完整教程

    CAS(Central Authentication Service)是 Yale 大学发起的一个开源项目,它提供了一种在Web 应用中统一处理用户认证的解决方案,被称为单点登录(Single Sign-On,简称SSO)。SSO允许用户在一个系统中登录后,无须...

    利用CAS实现单点登录的完整实例

    总结,通过学习和实践这个"利用CAS实现单点登录的完整实例",你将掌握如何使用Jasig CAS构建一个高效的单点登录系统,从而提升用户体验,简化身份验证管理,并加强系统的安全性。记得深入理解每个步骤,并根据实际...

    开源ITSM工具itop接入单点登录框架cas实现步骤.docx

    "itop接入CAS单点登录框架实现步骤" 本文将详细介绍开源ITSM工具iTop接入开源单点登录框架CAS的实现方法。该方法经过实践验证,已经在作者的单位中应用。 CAS框架简介 CAS(Central Authentication Service)是一...

    Weblogic使用YALE(耶鲁)CAS实现SSO单点登录 的方法.doc

    Weblogic 使用 YALE CAS 实现 SSO 单点登录的方法 一、Yale CAS 简介 Yale CAS 是耶鲁大学开发的一种开源的单点登录(SSO)解决方案,提供了一个通用的身份验证框架,允许用户使用单个身份验证来访问多个应用程序。...

    转载CAS_SSO单点登录实例详细步骤

    【CAS_SSO单点登录实例详细步骤】 ...通过以上步骤,你可以实现基于CAS的SSO单点登录功能。这个过程涉及了证书的生成、导入以及CAS服务器和客户端的配置,确保所有步骤正确执行,才能实现无缝的单点登录体验。

    用CAS实现框架的SSO单点登录

    为了实现CAS单点登录,首先需要对CASServer进行一系列的配置和准备,具体包括: - **准备工具**:例如Tomcat作为应用服务器,keytool工具用于生成证书等。 - **配置环境**:确保服务器环境满足CASServer的要求,...

    liferay+cas实现单点登录步骤

    【Liferay + CAS 实现单点登录步骤】 在IT领域,单点登录(Single Sign-On,简称SSO)是一种方便用户管理和身份验证的技术,它允许用户通过一次登录就能访问多个相互关联的应用系统,无需多次输入凭证。Liferay是一...

    CAS单点登录(SSO)服务端自定义认证+CAS客户端配置+CAS完整使用文档+CAS4.2.7 cas-serv服务端源码 cas-client客户端源码

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。本压缩包提供了CAS服务端自定义认证的实现,以及CAS客户端的配置...

    使用CAS整合CXF实现单点登录部署步骤

    本文将详细介绍如何使用CAS整合CXF,实现基于Tomcat服务器的单点登录部署步骤。 首先,我们需要在Tomcat服务器上部署CAS项目。这通常涉及以下步骤: 1. **下载CAS服务器**:从官方Git仓库或Maven仓库获取最新的CAS...

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

    使用 CAS 和 Windows AD 实现单点登录免身份认证可以提高用户体验和系统安全,减少身份验证步骤,提高工作效率。同时,CAS 和 Windows AD 都是开源的解决方案,降低了系统成本和维护难度。 结论 使用 CAS 和 ...

    Jeecg配置单点登录 登录验证完整代码

    配置Jeecg与CAS进行单点登录涉及以下几个步骤: 1. **安装和配置CAS服务器**:首先,你需要下载并安装Jasig CAS服务器,配置服务器的主配置文件`cas.properties`,包括数据库连接、服务端口、票证(Ticket)过期...

    cas实现单点登录 功能

    本文档将深入探讨如何使用 CAS 实现 Java 应用中的单点登录功能。 一、CAS 概述 CAS 是一个开源的身份验证框架,其核心目标是为用户提供一种集中式的身份验证方式,使得用户在访问各个应用时无需重复输入用户名和...

Global site tag (gtag.js) - Google Analytics