- 浏览: 96953 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhuce_4521:
谢谢分享!
Spring数据库事务 -
xh584990686:
感谢分享 经典~~~~~
CAS单点登录系列(5)-简单实施SSO之二 -
huze104:
1,memcached是什么?memcached服务器和客户端 ...
Memcached Linux安装部署 -
huze104:
DataImportHandler 最大的优点是基本不用写代码 ...
Solr 3.5 入门配置应用 -
yangpeihai:
谢谢分享,受益匪浅,不过上面到xml代码怎么都是重复的!
CAS单点登录系列(3)-简单实施SSO
在本系列文章的第3篇中,讲解了使用CAS实施单点登录的简单过程。
首先,CAS客户端的配置使用最简单的配置方式,全部配置都放在web.xml文件中。虽然这种配置方式很明了,但存在几个缺点。这种配置方式不仅使web.xml文件显得臃肿,而且相关属性的配置不够灵活,不易于管理。
其次,采用了keytool生成证书。尽管直接借助于keytool能够获得自签名的X.509证书,但keytool工具不支持签署其他证书。因此,在需要签署其他证书的时候,必须使用其他证书管理工具。
鉴于以上问题,本节将采用Spring过滤链的配置方式配置CAS Client,将臃肿的配置信息从web.xml中抽取出来,简化web.xml文件。使用OpenSSL管理证书,以弥补keyool的种种不足。
1.准备环境
操作系统:32位Window XP
CAS服务器:Cas Server 3.3.3
CAS客户端:Cas Client 3.1.10
Web服务器:Tomcat 6.0.18
数据库:MySQL 5.0
JDK:jdk1.5.0_10
2.基础环境准备
JDK安装后,复制两份 jdk1.5.0_10,分别命名为jdk_cas 和jdk_client 。
同样,复制两份 Tomcat 6.0.18,分别命名为apache-tomcat-cas 和apache-tomcat-client 。
配置Tomcat对应的JDK。打开apache-tomcat-cas/bin/catalina.bat 文件,在rem Guess CATALINA_HOME if not defined这行之前添加:set JAVA_HOME=您的安装路径/jdk_cas ,然后保存。同样方式配置apache-tomcat-client ,这样启动apache-tomcat-cas将使用jdk_cas,启动apache-tomcat-client将使用jdk_client。
3.生成证书
OpenSSL工具的安装配置请参考本系列文章的第1篇,接下来将生成根证书和服务器证书。
创建三个目录C:/openssl、C:/openssl/root、C:/openssl/server。然后在命令行下进入C:/openssl目录。
(注:整个过程中涉及到密码的地方均使用password )
3.1.创建根证书
//创建私钥
openssl genrsa -out root/root-key.pem 1024
//创建证书请求
openssl req -new -out root/root-req.csr -key root/root-key.pem
//证书信息,按顺序输入,最后一个选项An optional company name直接回车
CN
GuangDong
GuangZhou
JavaEECas
Programmer
root
root@163.com
password
//自签署根证书
openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650
//将根证书导出成浏览器支持的.p12(PKCS12)格式
openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12
3.2.创建服务器证书
//创建私钥
openssl genrsa -out server/server-key.pem 1024
//创建证书请求
openssl req -new -out server/server-req.csr -key server/server-key.pem
//证书信息
CN
GuangDong
GuangZhou
JavaEECas
Programmer
localhost
localhost@163.com
password
//签署服务器证书
openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
//将客户证书导出成浏览器支持的.p12(PKCS12)格式
openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12
4.启用HTTPS
4.1.在apache-tomcat-cas中启用HTTPS
打开apache-tomcat-cas/conf/server.xml,在<Connector port=”8080” …/>下面添加以下代码:
- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
- maxThreads="150" minSpareThreads="2" maxSpareThreads="10"
- scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS"
- keystoreFile="C:/openssl/server/server.p12" keystoreType="PKCS12" keystorePass="password"
- truststoreFile="C:/openssl/root/root.p12" truststoreType="PKCS12" truststorePass="password" />
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" minSpareThreads="2" maxSpareThreads="10" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:/openssl/server/server.p12" keystoreType="PKCS12" keystorePass="password" truststoreFile="C:/openssl/root/root.p12" truststoreType="PKCS12" truststorePass="password" />
其中,keystoreFile和truststoreFile根据实际情况进行修改。
4.2.导入证书
为了使客户端信任CAS Server,我们必须在客户端导入根证书。操作步骤:
1、打开Internet选项->证书->受信任的根证书颁发机构->导入->下一步,选择root.p12文件
2、输入密码
3、 选择证书存储位置
接着“下一步”直到导入成功。
4、查看已导入的证书
4.3.测试HTTPS
启动Tomcat,访问https://localhost:8443/,如果能够看到以下界面,地址栏右边出现锁图标,则说明HTTPS启用成功。
5.使用RDBMS认证
我们将采用“小蚂蚁-CAS单点登录系列(4)-使用RDBMS认证 ”一节所使用的cas3作为CAS认证服务器,将其拷贝到apache-tomcat-cas/webapps目录下。同时,别忘了把mysql驱动拷贝到cas3/WEB-INF/lib或apache-tomcat-cas/lib目录下。
重新启动Tomcat,如果测试使用数据库认证信息登录成功,说明CAS认证服务器配置完成。
6.配置客户端
创建Web应用client3,添加三个包cas-client-core-3.1.10.jar、commons-logging-1.0.4.jar、spring-2.5.6.jar。
6.1.修改apache-tomcat-client端口
总共有三个端口需要修改,分别是默认的Server元素的port="8005"、Connector元素port="8080"、Connector元素port="8009",笔者分别修改为9005、9090、9009。
6.2.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="WebApp_ID" version="2.5">
- <display-name>client3.1.10</display-name>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/classes/spring-appContext.xml
- </param-value>
- </context-param>
- <!-- Character Encoding filter -->
- <filter>
- <filter-name>encodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter>
- <filter-name>CAS Single Sign Out Filter</filter-name>
- <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
- </filter>
- <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>
- <filter-name>CAS HttpServletRequestWrapperFilter</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- <init-param>
- <param-name>targetBeanName</param-name>
- <param-value>casHttpServletRequestWrapperFilter</param-value>
- </init-param>
- </filter>
- <!-- 使得开发者可以在任意场合使用final Assertion assertion = AssertionHolder.getAssertion() -->
- <filter>
- <filter-name>CAS AssertionThreadLocalFilter</filter-name>
- <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
- </filter>
- <!-- Character Encoding -->
- <filter-mapping>
- <filter-name>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS Single Sign Out Filter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS Authentication Filter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS Validation Filter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS HttpServletRequestWrapperFilter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>CAS AssertionThreadLocalFilter</filter-name>
- <url-pattern>/secure/*</url-pattern>
- </filter-mapping>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <listener>
- <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
- </listener>
- </web-app>
<?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="WebApp_ID" version="2.5"> <display-name>client3.1.10</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/spring-appContext.xml </param-value> </context-param> <!-- Character Encoding filter --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <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> <filter-name>CAS HttpServletRequestWrapperFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>casHttpServletRequestWrapperFilter</param-value> </init-param> </filter> <!-- 使得开发者可以在任意场合使用final Assertion assertion = AssertionHolder.getAssertion() --> <filter> <filter-name>CAS AssertionThreadLocalFilter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <!-- Character Encoding --> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Authentication Filter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Validation Filter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS HttpServletRequestWrapperFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS AssertionThreadLocalFilter</filter-name> <url-pattern>/secure/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> </web-app>
6.3.添加资源文件
在类路径下新建文件cas-client.properties,内容如下:
cas.server.url=https://localhost:8443/cas3
cas.client.serverName=localhost:9090
第一行指定CAS服务器地址 ,第二行指定客户端服务名称,格式为:主机名:端口号
6.4.添加Spring配置文件
在类路径下新建文件spring-appContext.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-2.0.xsd">
- <!-- 定义环境变量 -->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="ignoreResourceNotFound" value="true" />
- <property name="location" value="classpath:cas-client.properties"/>
- </bean>
- <!-- 认证过滤器配置 -->
- <bean
- name="authenticationFilter"
- class="org.jasig.cas.client.authentication.AuthenticationFilter"
- p:casServerLoginUrl="${cas.server.url}/login"
- p:renew="false"
- p:gateway="false"
- p:serverName="${cas.client.serverName}" />
- <!-- 验证过滤器配置 -->
- <bean
- name="ticketValidationFilter"
- class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter"
- p:serverName="${cas.client.serverName}">
- <property name="ticketValidator">
- <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
- <constructor-arg index="0" value="${cas.server.url}" />
- </bean>
- </property>
- </bean>
- <!--
- <bean
- name="ticketValidationFilter"
- class="org.jasig.cas.client.validation.Cas10TicketValidationFilter"
- p:serverName="${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>
- -->
- <bean id="casHttpServletRequestWrapperFilter"
- class="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"/>
- </beans>
<?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-2.0.xsd"> <!-- 定义环境变量 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreResourceNotFound" value="true" /> <property name="location" value="classpath:cas-client.properties"/> </bean> <!-- 认证过滤器配置 --> <bean name="authenticationFilter" class="org.jasig.cas.client.authentication.AuthenticationFilter" p:casServerLoginUrl="${cas.server.url}/login" p:renew="false" p:gateway="false" p:serverName="${cas.client.serverName}" /> <!-- 验证过滤器配置 --> <bean name="ticketValidationFilter" class="org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter" p:serverName="${cas.client.serverName}"> <property name="ticketValidator"> <bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator"> <constructor-arg index="0" value="${cas.server.url}" /> </bean> </property> </bean> <!-- <bean name="ticketValidationFilter" class="org.jasig.cas.client.validation.Cas10TicketValidationFilter" p:serverName="${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> --> <bean id="casHttpServletRequestWrapperFilter" class="org.jasig.cas.client.util.HttpServletRequestWrapperFilter"/> </beans>
6.5.导入根证书
由于CAS Server启用了HTTPS,要使Web客户端信任其身份,必须为jdk_client 导入根证书。
keytool -import -v -trustcacerts -storepass changeit -alias root -file root/root-cert.pem -keystore E:/DevelopTools/JDK/jdk_client/jre/lib/security/cacerts
7.综合测试
7.1.启动apache-tomcat-cas
7.2.启动apache-tomcat-client
7.3.访问client3
访问http://localhost:9090/client3/secure/securedpage.jsp页面,将被引导到CAS登录页面。输入凭证信息,认证通过后将出现以下页面:
访问http://localhost:9090/client3/secure/debug.jsp页面,可以看到通过三种不同的方式获取用户名。
在http://localhost:9090/client3/secure/securedpage.jsp页面中,单击“退出”链接将单点退出系统。
8.可能遇到的问题
8.1报错 :
'unable to find valid certification path to requested target'
原因 :
Web应用服务器端没有导入根证书
解决方法 :
在jdk_client导入根证书。
至此,本节内容结束,有遗漏或疏忽的地方请大家指出,谢谢!
- client3.zip (2.6 MB)
发表评论
-
CAS单点登录系列(4)-使用RDBMS认证
2010-10-22 15:46 995在实际应用中,用户认证信息一般会存放在RDBMS或LDA ... -
CAS单点登录系列(3)-简单实施SSO
2010-10-22 15:04 1629默认时,为了启用Web SSO,开发者必须开启HTTPS ... -
CAS单点登录系列(2)-初步认识CAS
2010-10-22 15:02 12451.CAS介绍 CAS(Central Authenti ... -
CAS单点登录系列(1)-基础知识
2010-10-22 14:59 12261.单点登录 1.1.概述 ... -
cas 单点登录配置速成
2010-06-22 21:51 1619原理描述 子系统所有请求被CAS过滤器拦截(web.xml中定 ... -
Acegi安全系统详解
2010-06-22 17:56 802Acegi是Spring Framework 下最 ... -
应用J2EE构建项目登录方式的改进设计与实现
2010-06-22 17:52 669j2ee是当前建立和开发各 ... -
SSO技术简介
2010-06-22 17:51 739SSO(Single Sign-On,单点登录)是身份 ... -
单点登陆系统SSO原理
2010-06-22 17:50 726本文以某新闻单位多媒体数据库系统为例,提出建立企业用户认证中心 ... -
浅谈Acegi配置
2010-06-22 17:49 645Acegi是基于Spring的一个开源的安全认证框架,现在的 ... -
CAS logout问题释疑
2010-06-22 17:48 1026CAS Logout是一个非常费解的问题,广州UG版,网友不停 ... -
acegi 作为 yale cas认证服务器的客户端在springside项目中的应用
2010-06-22 17:47 843First, Set SpringSide's web.xm ... -
部署cas服务器实现定制JDBC验证
2010-06-22 17:22 9671 安装 1.1系统配置 以下的软件环境是必需的: 1. ... -
yale cas 配置
2010-06-22 17:20 966在配置YALE 的CAS里面,走 ... -
Yale cas安装
2010-06-22 16:59 735看了网上很多CAS安装的 ... -
CAS安全性介绍
2010-06-22 16:57 774CAS 的安全性是一个非常重要的 Topic 。 CAS 从 ... -
Yale CAS实现原理及其基础协议
2010-06-22 16:40 931CAS(Central Authentication Serv ...
相关推荐
spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库生成语句,采用的...
NULL 博文链接:https://zhanjia.iteye.com/blog/746437
本课程主要通过CAS来实现SSO,本教程会从最基本的基础知识讲起,由浅入深再到实战,完成多应用的单点登录功能。 本课程内容如下: 1、 什么是SSO和CAS 2、 CAS Server服务端和客户端的搭建和配置 3、 单点登录和单...
spring boot整合spring security 实现SSO单点登陆 完整DEMO. 1、配置本地hosts 127.0.0.1 sso-login 127.0.0.1 sso-resource 127.0.0.1 sso-tmall 127.0.0.1 sso-taobao windows系统的路径在C:\WINDOWS\system...
NULL 博文链接:https://zhanjia.iteye.com/blog/737592
单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS(Central Authentication ...
单点登录 sso cas带超详细文档,包含(cas-server-webapp-4.0.0.war、c3p0-0.9.1.2.jar、cas-client-core-3.3.3.jar、cas-server-support-jdbc-4.0.0.jar、cas-server-webapp-support-4.0.0.jar、commons-logging-...
sso/cas单点登录Java maven版 含服务端客服端
NULL 博文链接:https://572327713.iteye.com/blog/2356519
CAS实现sso单点登录原理,可以方便技术人员理解
SSO之CAS单点登录详细教程+CAS服务端jar+CAS服务端应用+客户端jar
包含cas源码、cas使用说明文档(包含配置信息)、连接数据库所需jar包、cas服务端自定义返回值等
SSO之CAS单点登录详细教程.docx
SSO之CAS单点登录详细图文教程,里面包含实现逻辑分析和流程介绍
discuz x2.5和cas集成,实现cas单点登录 SSO , php-5.2.14-Win32,Apache 2 2 ,PHPnow-1.5.6
[置顶] 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 ...
单点登录(Single Sign On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 CAS(Central Authentication ...
因为公司要实现SSO单点登录的效果,最近在网上找了一些资料,但是都没有好用的, 所以自己用PHP 使用TP5.0 实现了SSO单点登录,可以跨多个域名。 下载后在本地配置好 A,B,C 3个网站,就可以模拟效果了。
SSO之CAS单点登录实例演示