`
dakulaliu
  • 浏览: 98026 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring Security 2.0 + CAS 配置单点登录学习配置笔记

阅读更多
Spring Security 2.0是基于原先的Acegi Security安全认证框架基础上的新版本。其中集成了很多权限验证系统,我想大家最熟知的可能就是耶鲁大学的CAS了,今天花了半天的时间搭建了一个Spring Security提供的例子,以下就是这半天的学习笔记:

准备工作:
1.Java SE Development Kit (JDK) 6 Update 10(include JRE):
http://java.sun.com/javase/downloads/index.jsp
2.Tomcat 6.0.18:
http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip
3.Eclipse 3.4(WTP)
http://download.actuatechina.com/eclipse/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-win32.zip
4.下载最新的Spring发行版本2.5.5:http://nchc.dl.sourceforge.net/sourceforge/springframework/spring-framework-2.5.5-with-dependencies.zip
5.下载最新的Spring Security的发行版本2.0.4:http://nchc.dl.sourceforge.net/sourceforge/springframework/spring-security-2.0.4.zip
6.下载最新的CAS发新版本包括Server端的和客户端的:
http://www.ja-sig.org/downloads/cas/cas-server-3.3-release.zip
http://www.ja-sig.org/downloads/cas-clients/cas-client-3.1.3-release.zip

好了,下载完成这些准备文件之后解压到你喜欢的路径下,JDK、Tomcat以及Eclipse WTP开发套件的安装准备工作这里不再赘述。

下面是具体的步骤:
1.配置Tomcat支持SSL服务,具体详细步骤请参看javaeye论坛的一片文章http://www.iteye.com/topic/78274(作者:eddie ),我这里只给出最主要的几个步骤,这里认为你知道并且熟悉相关环境变量,以及PATH配置:
a.切换到Tomcat的安装目录
cd %CATALINA_HOME% 

b.生成Server Key,此处注意输入的用户名称使用localhost或者你所拥有的域名。
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 365

c.将证书导入到JRE的证书信任库中
keytool -export -trustcacerts -alias tomcat -file server.cer -keystore  server.keystore -storepass changeit

keytool -import -trustcacerts -alias tomcat -file server.cer -keystore  %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

d.配置你的Tomcat服务器配置文件%CATALINA_HOME%/conf/server.xml,其中有一块相关SSL的配置被注释掉了,将一下代码粘贴进去:
 <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"  
            port="8443" minSpareThreads="5" maxSpareThreads="75"  
            enableLookups="true" disableUploadTimeout="true"    
            acceptCount="100"  maxThreads="200"  
            scheme="https" secure="true" SSLEnabled="true"  
            clientAuth="false" sslProtocol="TLS"  
            keystoreFile="[your_tomcat_install_path]/server.keystore"    
            keystorePass="changeit"/> 

到此,Tomcat相关的SSL配置工作完成,启动Tomcat,访问https://localhost:8443/验证。

2.部署CAS服务,在CAS Server发行包中,有一个war包cas-server-3.3\modules\cas-server-webapp-3.3.war,将其重命名为cas.war,将其部署到Tomcat的webapps下,启动Tomcat如果一切正常,访问http://localhost:8080/cas可以访问CAS服务。
但不知道什么原因,文件webapps/cas/WEB-INF/view/jsp/default/ui/casLoginView.jsp中第48行代码有错误,原因是双引号混乱造成,因此此行需要简单的修改一下:
引用
<c:set var="query" value=<%=request.getQueryString() == null ? "" : request.getQueryString().replaceAll("&locale=([A-Za-z][A-Za-z]_)?[A-Za-z][A-Za-z]|^locale=([A-Za-z][A-Za-z]_)?[A-Za-z][A-Za-z]", "")%> />

将此处代码中红色标注的双引号修改为单引号。再访问http://localhost:8080/cas/就可以看到CAS页面。

3.下载Spring Security 和CAS相关的样例代码,由于Spring Security 2.0并没有把CAS相关的样例代码放到其发行版本中,因此需要通过SVN获取相关代码,SVN地址是:
http://acegisecurity.svn.sourceforge.net/svnroot/acegisecurity/spring-security/trunk,CAS相关Sample在spring-security\samples\cas目录下,分为server和client两个文件夹,Server相关部分我们已经手工完成,因此此处我们只需要关系client部分。因为官方是使用Maven方式构建项目,因此我们需要手工将源代码导入到Eclipse工程中,如何导入此处不再赘述。
需要注意的是:
a.项目名称(导出的war文件名称)最好使用与在applicationContext-security.xml中同意的cas-sample,因为这个配置文件中配置到一些此应用部署到tomcat之后的地址,例如:https://localhost:9443/cas-sample/secure/receptor
b.我们还要注意,目前我们的Tomcat SSL相关的端口为8443,而且我们希望CAS Server和我们的Web 应用部署到同一台Tomcat上,因此需要将applicationContext-security.xml中涉及到所有的9443端口修改成8443端口。
c.还有一个文件中用到的URL链接使用了9443端口。同样需要修改成8443端口cas-sample/cas-logout.jsp。
d.添加相关的jar包到WEB-INF/lib中,包括:
  cas-client-core-3.1.3.jar
  comons-logging-1.1.jar
  log4j-1.2.9.jar
  spring.jar
  spring-security-cas-client-2.0.4.jar
  spring-security-core-2.0.4.jar

4.到此配置修改完成,将你的Dynamic Web Project到导出一个war包:cas-sample.war部署到Tomcat服务器,启动Tomcat,访问:http://localhost:8080/cas-sample/secure/index.jsp,此页面是需要认证的页面,会跳转至cas认证页面,登录去输入rod/rod(在applicationContext-security.xml中配置,因为需要使用到这些配置用户的授权信息),便可登录到我们自己的cas-sample应用。

至此,我们的Spring Security 2.0 + CAS单点登录系统简单配置完成。
7
4
分享到:
评论
3 楼 lulcxu 2009-08-14  
因为官方是使用Maven方式构建项目,因此我们需要手工将源代码导入到Eclipse工程中,如何导入此处不再赘述。



希望可以说说,因为需求的原因需要改动CAS SERVER服务器,但一直无法将它转换成ECLIPSE项目。

希望可以给出详细的流程及前提条件(比如开发机器是否要求连接外网,因为我的开发机器无法连接外网)
2 楼 wangyu 2009-01-20  
帮我看一下这个异常
2009-01-20 16:55:54,968 INFO [org.jasig.cas.web.flow.InitialFlowSetupAction] - <Setting path for cookies to: /cas>
2009-01-20 16:56:04,765 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - <AuthenticationHandler: org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler successfully authenticated the user which provided the following credentials: [username: rod]>
2009-01-20 16:56:04,843 INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - <Granted service ticket [ST-1-CRuiVmmfkds9mJtbfHjZ-cas] for service [https://localhost:8443/cas-sample/j_spring_cas_security_check] for user [rod]>
16:56:05,125 ERROR Cas20ServiceTicketValidator:49 - 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
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
	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
	at org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.java:35)
	at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:178)
	at org.springframework.security.providers.cas.CasAuthenticationProvider.authenticateNow(CasAuthenticationProvider.java:145)
	at org.springframework.security.providers.cas.CasAuthenticationProvider.authenticate(CasAuthenticationProvider.java:131)
	at org.springframework.security.providers.ProviderManager.doAuthentication(ProviderManager.java:188)
	at org.springframework.security.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:46)
	at org.springframework.security.ui.cas.CasProcessingFilter.attemptAuthentication(CasProcessingFilter.java:94)
	at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:258)
	at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
	at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
	at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	at org.springframework.security.securechannel.ChannelProcessingFilter.doFilterHttp(ChannelProcessingFilter.java:116)
	at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
	at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
	at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:183)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:138)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:99)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.java:880)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:719)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:2081)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
	... 51 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(Unknown Source)
	... 56 more

1 楼 jelver 2008-12-15  
不错,我们最近也用到

相关推荐

    Struts2.0+Spring2.0+Hibernate3.1登录及增删改查的完整演示示例

    应广大网友需求,自己抽了点时间写了一个Struts2.0+Spring2.0+Hibernate3.1的登录及增删改查的完整演示示例,以此奉献给大家,由于本人水平有限,有写的不好的地方还望大家多提宝贵意见,如果有不明白的地方请关注我的...

    struts2+spring2.0+hibernate3.2+Security2.0+全部jar包

    struts2+spring2.0+hibernate3.2+Security2.0的demo程序 里面带有 mysql的 DBdump, 可以直接导入DB S2SH的整合使用注解的方式 里面包括全部的jar包

    spring security + oauth 2.0 实现单点登录、认证授权

    Spring Security和OAuth 2.0是两个在Web应用安全领域广泛应用的框架,它们结合使用可以构建强大的单点登录(SSO)和认证授权系统。在这个系统中,`xp-sso-server`代表了认证服务器,而`xp-sso-client-a`和`xp-sso-...

    SpringBoot+Security+Cas

    总的来说,这个Demo提供了一个基础的示例,展示了如何利用Spring Boot的便捷性,结合Spring Security的强大安全功能,以及CAS的单一登录特性,构建一个安全的Web应用。开发者可以通过研究这个Demo,学习如何配置和...

    springboot+security+cas集成demo

    1. **配置CAS客户端**:在Spring Boot应用中,我们需要引入CAS客户端库,例如`spring-security-cas`,并配置相关的CAS服务器地址、服务验证URL等。 2. **配置Spring Security**:在Spring Security的配置类中,设置...

    Struts1.2+Spring2.0+Hibernate3.1 Struts1.2+Spring2.0+Hibernate3.1

    Struts1.2+Spring2.0+Hibernate3.1Struts1.2+Spring2.0+Hibernate3.1Struts1.2+Spring2.0+Hibernate3.1Struts1.2+Spring2.0+Hibernate3.1

    springsecurity+oauth2+jwt实现单点登录demo

    该资源是springsecurity+oauth2+jwt实现的单点登录demo,模式为授权码模式,实现自定义登录页面和自定义授权页面。应用数据存在内存中或者存在数据库中(附带数据库表结构),token存储分为数据库或者Redis。demo...

    struts2.0+spring2.0+hibernate3.0所需要的包

    struts2.0+spring2.0+hibernate3.0所需要的包 struts2.0+spring2.0+hibernate3.0所需要的包 struts2.0+spring2.0+hibernate3.0所需要的包 struts2.0+spring2.0+hibernate3.0所需要的包

    单点登录实现 Spring_security+CAS

    通过以上步骤,你可以构建一个基于Spring Security和CAS的单点登录系统。这个过程需要对Spring Security和CAS有深入的理解,以及一定的Java Web开发经验。通过实践和学习,你将能熟练掌握这个技术,并应用于实际项目...

    spring security 基于oauth 2.0 实现 sso 单点登录Demo.zip

    spring security 基于oauth 2.0 实现 sso 单点登录Demo 使用 spring security 基于oauth 2.0 实现 sso 单点登录Demo spring boot + spring security + spring security oauth

    springmvc+spring+shiro+cas单点登录实例

    spring+springmvc+shiro+cas单点登录实例 springmvc+spring+shiro+cas单点登录实例 加入了登录验证码认证,修改了下首页样式,不过样式没有弄好,很丑的,有空自己再弄下 说明:cas-server是单点登录服务端,用的是...

    Spring Security OAuth2.0学习笔记.zip

    Spring Security OAuth2.0学习笔记 什么是认证、授权、会话。 Java Servlet为支持http会话做了哪些事儿。 基于session认证机制的运作流程。 基于token认证机制的运作流程。 理解Spring Security的工作原理,Spring ...

    struts1.2+spring2.0+hibernate3.0所需要的包

    struts1.2+spring2.0+hibernate3.0所需要的包 struts1.2+spring2.0+hibernate3.0所需要的包 struts1.2+spring2.0+hibernate3.0所需要的包 struts1.2+spring2.0+hibernate3.0所需要的包

    struts2.0+spring2.5+hibernate3.0整合框架,下载导入到eclipse下即可

    struts2.0+spring2.5+hibernate3.0整合框架,下载导入到eclipse下即可。。启动tomcat前先修改jdbc.properties文件。由于lib文件较大,所以请自行导入相关lib包。

    基于springboot+oauth2.0+jwtToken鉴权认证开发的后台接口,整套架构采用restful风格,车牌识别,阿里云消息推送,短信接口等

    内容只为接口开发,配合前端和移动app调用使用,不包含html页面,基于springboot+oauth2.0+jwttoken鉴权(内有怎么使用redistoken和数据库token注释)+restful风格+阿里短信+阿里消息推送+车牌识别等。该项目为工作...

    Spring-Security2.0 和 3.0中文文档

    学习Spring Security 2.0 和 3.0 的中文文档,将帮助开发者深入理解如何配置和使用其核心组件,以及如何处理常见的安全问题。文档通常会包含详细的配置示例、API参考、教程和最佳实践,帮助开发者构建安全的Java应用...

    spring security oauth2.0 (讲义+代码)

    Spring Security OAuth2.0 是一个强大的安全框架,用于构建安全的Web应用和API。OAuth2.0 是一种授权框架,允许第三方应用在用户许可的情况下访问其受保护的资源,而无需共享用户凭证。本讲义结合代码将深入探讨如何...

    ext2.0+struts2.1+spring2.0+jdbc框架

    标题 "ext2.0+struts2.1+spring2.0+jdbc框架" 提到的是一个基于Java的Web开发架构,它结合了四个关键组件:EXT JS的2.0版本,Struts2.1,Spring2.0,以及JDBC(Java Database Connectivity)。这个组合在早期的Web...

    Spring+2.0+技术手册

    ### Spring 2.0 技术手册核心知识点详解 #### 一、Spring 框架简介 Spring 是一个开源框架,最初由 Rod Johnson 创建,它为简化企业级应用开发提供了全面的基础架构支持。Spring 2.0 版本在原有基础上进行了大幅度...

    spring boot2.0 + elasticsearch+ redis

    spring boot2.0 + elasticsearch+ redis 遇到elasticsearch执行不成功

Global site tag (gtag.js) - Google Analytics