`
bh三少
  • 浏览: 102063 次
  • 性别: Icon_minigender_1
  • 来自: 北海
社区版块
存档分类
最新评论

cas+tomcat开发单点登录教程(定制认证方式篇)

 
阅读更多

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法。CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。如附件“cas原理.jpg”所示。

CAS Client 与受保护的应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定的 CAS Server 登录地址,并传递要访问的目的资源地址,以便登录成功过后重定向到该地址。用户在输入认证信息后,如果登录成功,CAS Server 随机产生一个 Service Ticket,并缓存该Service Ticket以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。

 

以下内容基于CAS Client与CAS Server的交互采用SSL协议。

 

1.环境:JDK1.6+Tomcat6.0.32+cas-Server3.4.31+cas-Client3.1.12

 

2.利用JDK的keytool生成证书

 

在生产环境中,证书需要到证书提供商处购买。

正确设置%JAVA_HOME%,在DOS窗口下运行以下命令:keytool -genkey -alias wsria -keyalg RSA -keystore E:/sso/keys/dcssokey 如附件“生成证书截图.jpg”所示。这样在 E:/sso/keys目录下就会生成dcssokey的文件。

 

3.设置域名

cas建议用域名访问而不用IP地址访问,所以要设置一下域名,在C:\Windows\System32\drivers\etc下修改hosts文件,加入:(IP)10.5.227.125 sso.unifyaa.com(不要用127.0.0.1)

 

4.导出证书

利用keytool命令导出证书,如附件“导出证书.jpg”所示。这样在 E:/sso/keys目录下就会生成dcsso.crt的文件。

 

5.为JVM导入证书

利用keytool名利为JVM导入证书,导入之前先确定%JAVA_HOME%\jre\lib\security目录下是否存在cacerts的文件,如果存在则删除该文件,利用keytool命令为JVM导入证书,如附件“JVM导入证书.jpg”所示。

 

6.web服务器应用证书

 

修改%TOMCCAT_HOME%/conf/server.xml文件,

  <!-- 启用HTTPS协议 -->

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS"

      keystoreFile="E:/sso/keys/dcssokey" keystorePass="dcfs00"

      truststoreFile="D:/ProgramFiles/Java/jdk1.6.0_25/jre/lib/security/cacerts" />

启动tomcat,在浏览器输入地址:https://sso.unify.com:8443 就会提示证书安全问题,点击“继续浏览”就可进入tomcat目录。

 

7.部署CAS Server应用

 

解压下载的cas-server-3.4.3.1.zip包,在cas-server-3.4.3.1\modules目录下找到cas-server-webapp-3.4.3.1.war文件,把该文件拷贝至%TOMCAT_HOME%\webapps下,并改名为cas.war,

重启tomcat,在浏览器输入https://sso.unifyaa.com:8443/cas/login 弹出cas的登录界面,如附件“cas登录界面.jpg”所示。

在登录界面输入admin/admin,登录成功,如附件“cas登录成功界面.jpg”所示。

注:在CAS Server中,默认使用org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler类作登录身份认证处理,这个不适用生产环境,我们需要使用定制化的AuthenticationHandler。

 

8.定制CAS Server的用户身份认证接口

CAS 提供扩展认证的核心是 AuthenticationHandler 接口。CAS还提供了 AuthenticationHandler 接口的一些抽象实现,以满足我们的复杂应用,如:AbstractPreAndPostProcessingAuthenticationHandler,可在身份认证前后做一些操作。对于最常用的用户名/密码认证方式,CAS也提供了支持,由类AbstractUsernamePasswordAuthenticationHandler提供支持。

通常用户信息一般都存在于数据库,我们通过JDBC的方式来验证用户信息。CAS提供了通过JDBC连接数据库认证用户的默认实现,需要/cas-server-3.4.3.1/modules/cas-server-support-jdbc-3.4.3.1.jar包的支持。把该包

copy到tomcat的webapps下的cas.war的WEB-INF/lib下。

增加dataSource。在tomcat的/webapps/cas/WEB-INF/deployerConfigContext.xml添加以下内容:

 

<bean id="casDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driverClassName}" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 最大连接数 -->
		<property name="maxPoolSize" value="${hibernate.c3p0.max_size}" />
		<!-- 最小连接数 -->
		<property name="minPoolSize" value="${hibernate.c3p0.min_size}" />
		<!-- 初始化连接数 -->
		<property name="initialPoolSize" value="${hibernate.c3p0.initial_pool_size}" />
		<!-- 最大空闲时间 ,120秒内未使用则连接被丢弃。若为0则永不丢弃 -->
		<property name="maxIdleTime" value="${hibernate.c3p0.max_idle_time}" />
		<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
		<property name="acquireIncrement" value="${hibernate.c3p0.acquire_increment}" />
		<!-- 最大的PreparedStatement的数量 -->
		<property name="maxStatements" value="${hibernate.c3p0.max_statements}" />
		<!-- 每隔120秒检查连接池里的空闲连接-->
		<property name="idleConnectionTestPeriod" value="${hibernate.c3p0.idle_test_period}" />
		<!-- 如果设为true那么在取得连接的同时将校验连接的有效性 。Default: false -->
		<property name="testConnectionOnCheckin" value="${hibernate.c3p0.test_connection_on_checkin}" />
		<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
		<property name="acquireRetryAttempts" value="${hibernate.c3p0.acquire_retry_attempts}" />
		<!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
		<property name="autoCommitOnClose" value="${hibernate.c3p0.auto_commit_on_close}" />
		<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。
			如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
		<property name="breakAfterAcquireFailure" value="${hibernate.c3p0.break_after_acquire_failure}" />
		<!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3--> 
		<property name="numHelperThreads" value="${hibernate.c3p0.num_helper_threads}" />
		<!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。Default: 0 --> 
		<property name="checkoutTimeout" value="${hibernate.c3p0.checkout_timeout}" />
	</bean>

 

 以上用的是c3p0作为dataSource的实现,dataSource的作用大家都比较清楚,这里就不做解释了。

在tomcat的\webapps\cas\WEB-INF目录下新建两个文件,分别是jdbc.properties和c3p0.properties,内容如下:

jdbc.properties

 

# Properties file with JDBC-related settings.
# Applied by PropertyPlaceholderConfigurer from "applicationContext.xml".
# Targeted at system administrators, to avoid touching the context XML files.

## MySQL

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://10.5.227.125:3306/dcsso?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

## Oracle

#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
#jdbc.username=ccgd
#jdbc.password=ccgd

## H2

#jdbc.driverClassName=org.h2.Driver
#jdbc.url=jdbc:h2:tcp://localhost/~/test
#jdbc.username=sa
#jdbc.password=

 

 c3p0.properties

 

###########################
### C3P0 Connection Pool###
###########################
hibernate.c3p0.max_size 50
hibernate.c3p0.min_size 2
hibernate.c3p0.initial_pool_size 3
hibernate.c3p0.max_idle_time 120
hibernate.c3p0.acquire_increment 2
hibernate.c3p0.max_statements 100
hibernate.c3p0.idle_test_period 120
hibernate.c3p0.test_connection_on_checkin true
hibernate.c3p0.acquire_retry_attempts 30
hibernate.c3p0.auto_commit_on_close false
hibernate.c3p0.break_after_acquire_failure false
hibernate.c3p0.num_helper_threads 3
hibernate.c3p0.checkout_timeout 30000
hibernate.c3p0.validate true

 

c3p0需要jar包的支持,c3p0-0.9.1.jar、commons-collections-3.2.1.jar、commons-pool-1.5.4.jar,同时把数据库连接驱动(这里用mysql)mysql-connector-java-5.1.6.jar包都copy到cas/WEB-INF/lib下。

 在tomcat的\webapps\cas\WEB-INF\spring-configuration目录下找到propertyFileConfigurer.xml文件,修改如下:

propertyFileConfigurer.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<description>
		This file lets CAS know where you've stored the cas.properties file which details some of the configuration options
		that are specific to your environment.  You can specify the location of the file here.  You may wish to place the file outside
		of the Servlet context if you have options that are specific to a tier (i.e. test vs. production) so that the WAR file 
		can be moved between tiers without modification.
	</description>
    
	<!--
	<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
		p:location="/WEB-INF/cas.properties" /> -->

	<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>/WEB-INF/cas.properties</value>
				<value>/WEB-INF/jdbc.properties</value>
				<value>/WEB-INF/c3p0.properties</value>
			</list>
		</property>
	</bean>
</beans>

 

 让应用启动的时候加载jdbc.properties和c3p0.properties文件。

修改cas/WEB-INF下的deployerConfigContext.xml文件。注释掉以下内容:

 

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

 

 添加以下内容:

 

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
					<property name="dataSource" ref="casDataSource" />
					<property name="sql" value="select password from loginusers where lower(loginName) = lower(?)" />
					<property name="passwordEncoder"  ref="passwordEncoder"/>
				</bean>

 

我们可以使用QueryDatabaseAuthenticationHandler,也可以使用SearchModeSearchDatabaseAuthenticationHandler,使用SearchModeSearchDatabaseAuthenticationHandler的配置如下:

 

<bean id="SearchModeSearchDatabaseAuthenticationHandler"
      class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
      abstract="false" singleton="true" lazy-init="default" 
                       autowire="default" dependency-check="default">
  <property  name="tableUsers">
   <value>loginusers</value>
  </property>
  <property name="fieldUser">
   <value>loginName</value>
  </property>
  <property name="fieldPassword">
   <value>password</value>
  </property>
  <property name="dataSource" ref=" casDataSource " />
</bean>

 

 由于我们的密码一般都是经过加密的,所以在认证信息的时候需要对用户提交的密码进行加密,CAS提供了MD5加密的默认实现,配置如下:

 

<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
		<constructor-arg value="MD5"/>
	</bean>

 然后在mysql数据库中新建一张表:loginUsers,字段为loginname和password,并新增一条记录,启动tomcat,在浏览器输入https://sso.unify.com:8443/cas/login,会提示证书错误,点击继续浏览就可以了,在登录界面输入新建记录的用户名和密码,就可以登录成功了。

 

附:

若CAS Server与CAS Client的交互不想使用SSL协议,则注释掉%TOMCAT_HOME%\conf\server.xml文件中的这段内容:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
			   keystoreFile="E:/sso/keys/dcssokey" keystorePass="dcfs00"
			   truststoreFile="D:/ProgramFiles/Java/jdk1.6.0_25/jre/lib/security/cacerts" />

 在%TOMCAT_HOME%\webapps\cas\WEB-INF\deployerConfigContext.xml文件中找到如下内容:

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
					p:httpClient-ref="httpClient" />

 在/>前加上如下内容:p:requireSecure="false",表示不需要安全协议。

接着在%TOMCAT_HOME%\webapps\cas\WEB-INF\spring-configuration目录下修改ticketGrantingTicketCookieGenerator.xml文件,修改后的内容如下:

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
		p:cookieSecure="false"
		p:cookieMaxAge="600"
		p:cookieName="CASTGC"
		p:cookiePath="/cas" />

 p:cookieSecure="false",表示cookie也不需要安全协议,p:cookieMaxAge设置cookie的有效时长。

重启tomcat,在浏览器输入http://sso.unifyaa.com:8080/cas/login 就可以访问了。

  • 大小: 30.3 KB
  • 大小: 81.4 KB
  • 大小: 16.3 KB
  • 大小: 58.4 KB
  • 大小: 80.4 KB
  • 大小: 76.5 KB
分享到:
评论

相关推荐

    cas-2.5.3 + mysql单点登录

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决网络应用中的身份验证问题。在“cas-2.5.3 + mysql单点登录”这个项目中,我们将使用CAS 2.5.3...

    openjdk11+tomcat9+CASServer.zip

    5. **测试SSO功能**: 创建一个CAS客户端应用,配置相应的服务URL和验证机制,然后尝试登录,看是否能够实现单点登录。 6. **自定义和扩展**: 根据需求,可以进一步定制CAS Server的行为,如编写自定义认证模块、...

    定制cas单点登录用户名密码验证

    这些文件名暗示了学习资源的内容,包括Yale大学的CAS教程、关于CAS的Java开发者论坛讨论、一篇关于CAS最佳实践的文章以及一篇关于在Tomcat上开发CAS单点登录并定制认证方式的博客文章。这些资料将提供详细的步骤、...

    耶鲁CasServer单点登录教程

    【耶鲁CasServer单点登录教程】 一、Yale CAS简介 Yale Central Authentication Service (CAS) 是一个开源的身份验证框架,由耶鲁大学开发,主要用于实现单点登录(Single Sign-On, SSO)。SSO允许用户在一个系统上...

    cas单点登录服务端

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)系统,主要用于统一管理Web应用程序的身份验证。它允许用户在访问多个应用系统时只需要进行一次登录,之后再访问...

    cas实现单点登录服务端及客户端

    CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,SSO)框架,由耶鲁大学开发并维护。SSO允许用户通过一次登录验证就能访问多个应用系统,无需在每个系统之间单独进行...

    CAS 单点登录,tomcat配置SSL,及资源

    CAS(Central Authentication Service)是耶鲁大学开发的一款开源的身份验证框架,它提供了一种在多个应用系统间共享用户身份验证的方式,实现了单点登录(Single Sign-On,简称SSO)。单点登录意味着用户只需要在一...

    cas.rar_cas java_cas服务端代码_单点登录

    CAS(Central Authentication Service)是...综上所述,这个“cas.rar”压缩包是学习和实践CAS单点登录服务端开发的宝贵资源,通过研究其中的代码,开发者可以掌握CAS的工作原理,进而实现和定制自己的SSO解决方案。

    CAS单点登录SSO( Single Sign-On)

    CAS(Central Authentication Service)单点登录(Single Sign-On,简称SSO)是一种网络认证协议,旨在简化用户在多个应用系统间的登录流程。当用户通过CAS认证后,可以在无需再次输入凭证的情况下访问已接入CAS的...

    cas 单点登录 server client

    CAS(Central Authentication Service)是Java开发的一个开源单点登录(Single Sign-On,简称SSO)框架,主要用于解决多应用系统中的用户身份验证问题。在单点登录系统中,用户只需要登录一次,就可以访问所有相互...

    CAS单点登录

    CAS(Central Authentication Service)是Java开发的一个开源身份验证框架,它提供了一种集中式的认证服务,使得用户在访问多个应用系统时只需要登录一次,即实现单点登录(Single Sign-On,简称SSO)。这个技术在...

    cas单点登录代码例子 有文档 服务端客户端例子 亲测可用

    CAS(Central Authentication Service)是Java开发的一个开源单点登录(Single Sign-On,SSO)框架,主要用于实现用户在多个应用系统中的统一身份验证。在这个压缩包中,包含了一个CAS服务端和客户端的代码实例,...

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

    通过这个教程,你不仅能够掌握CAS SSO的基本操作,还能对单点登录的原理和技术有更深入的理解,为实现安全、高效的用户身份验证打下坚实的基础。如果你是初学者,这个教程会是一个很好的起点。尽管链接可能已失效,...

    cas-server sso单点登录服务端

    单点登录(Single Sign-On,简称SSO)是一种身份验证技术,它允许用户在一次登录后,无需再次输入凭证即可访问多个相互关联的应用系统。在企业环境中,这极大地提升了用户体验,减少了用户记忆和管理多个账号密码的...

    myeclipse、tomcat集成CAS

    6. **扩展和优化**:CAS支持多种定制化选项,如自定义登录界面、单点登出、票证超时策略等。你可以根据实际需求对配置进行调整,以实现更安全和个性化的SSO体验。 在“tomcat集成CAS.doc”文档中,应该详细介绍了在...

    cas单点登录.

    CAS(Central Authentication Service)是Java开发的一个开源的单点登录(Single Sign-On,简称SSO)框架,主要用于解决用户在访问多个系统时需要反复输入用户名和密码的问题。它通过一个中心认证服务器,使得用户只...

    CAS单点登陆图文教程

    CAS(Central Authentication Service)是Java开发的一个开源身份验证框架,它提供了一种集中式的、基于Web的单点登录(Single Sign-On, SSO)解决方案。SSO允许用户在一个应用系统中登录后,无需再次认证即可访问...

    关于CAS开源单点登录的点点滴滴

    CAS(Central Authentication Service)是一种广泛使用的开源单点登录(Single Sign-On, SSO)框架,它允许用户通过一个认证中心来访问多个应用系统,而无需在每个系统上分别登录。CAS的出现极大地简化了多应用环境...

    CAS单点登陆

    【CAS单点登录技术】是Web应用程序中的一种身份验证机制,允许用户在访问多个相互关联的应用系统时只需要登录一次,实现“一次登录,全局通行”的功能。SSO(Single Sign-On)分为Web-SSO和桌面SSO,本文主要探讨的...

Global site tag (gtag.js) - Google Analytics