`
bh三少
  • 浏览: 101032 次
  • 性别: 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
分享到:
评论

相关推荐

    MaxKey单点登录认证系统-其他

    寓意是最大钥匙,是业界领先的企业级IAM身份管理和身份认证产品,支持OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS等标准化的开放协议,提供简单、标准、安全和开放的用户身份管理(IDM)、身份认证(AM)、单点登录...

    java开源包1

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包11

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包2

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包3

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包6

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包5

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包10

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包4

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包8

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包7

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包9

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    java开源包101

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    Java资源包01

    Agorava 是一个实现了 OAuth 1.0a 和 OAuth 2.0 的框架,提供了简单的方式通过社交媒体进行身份认证的功能。 Eclipse的JavaScript插件 JSEditor JSEditor 是 Eclipse 下编辑 JavaScript 源码的插件,提供语法高亮...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

Global site tag (gtag.js) - Google Analytics