本次配置CAS耗时1周有余,从中学到了很多东西,现将这些东西整理一下分享出来,以供后来者借鉴。
起初接到这个任务,我就开始在网上搜资料,各种帖子来看,但是效果并不是很理想,因为帖子太多了,说法太多了,而且都不是很符合自己的实际项目情况。
其中关于配置这一块我不得不提一下这个帖子,http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
说得很详细,也很全面,只要不是太粗心,都能够一次通过cas的配置。
首先,这个帖子是在你对CAS有一定的了解了之后才能看懂。
大致说一下,我的项目环境,分为两个子项目,一个是php,一个是java。
PHP需要下载phpCas,https://wiki.jasig.org/display/CASC/phpCAS
java需要下载cas-client,https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1,
至于配置的细节,官网比我所见到的帖子都更加详尽,所以可以参考官网https://wiki.jasig.org。
TGT:ticket granting ticket 在用户在CAS认证成功后,CAS生成cookie,写入浏览器,同时生成一个TGT对象,放入自己的缓存,TGT对象的ID就是cookie的值。当HTTP再次请求到来时,如果传过来的有CAS生成的cookie,则CAS以此cookie值为key查询缓存中有无TGT ,如果有的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
ST:service ticket ST是CAS为用户签发的访问某一service的票据。用户访问service时,service发现用户没有ST,则要求用户去CAS获取ST。用户向CAS发出获取ST的请求,如果用户的请求中包含cookie,则CAS会以此cookie值为key查询缓存中有无TGT,如果存在TGT,则用此TGT签发一个ST,返回给用户。用户凭借ST去访问service,service拿ST去CAS验证,验证通过后,允许用户访问资源。
ST的使用次数(默认一次)和过期时间,TGT的过期时间在cas\WEB-INF\spring-configuration\ticketExpirationPolicies.xml里面设置。
下面是我在本次配置的过程中出现的问题及其解决方法:
1.在配置php客户端的时候,Fatal error: Call to undefined function curl_init() in D:\MYOA\webroot\CAS\Request\CurlRequest.php on line 105
解决办法:添加php_curl模块,打开php.ini的注释,然后下载相应版本的php_curl.dll及其依赖的动态链接库ssleay32.dll和libeay32.dll。
2.去掉https的认证协议,使用http协议进行认证和ticket的传输
解决方法:在cas\WEB-INF\deployConfig.xml里面将
1 |
< bean class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
|
2 |
p:httpClient-ref = "httpClient" />
|
添加一个属性
1 |
< bean class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
|
2 |
p:httpClient-ref = "httpClient" p:requireSecure = "false" />
|
还有一个地方,cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml
修改成,
1 |
< bean id = "ticketGrantingTicketCookieGenerator" class = "org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
|
2 |
p:cookieSecure = "false" //使用http进行cookie传输
|
另外,web.xml里面的casServerLoginUrl需要修改成http协议
3.在cas中使用jasypt查看认证的用户名密码是否正确
解决方法:在deployConfig.xml里面修改默认的认证方法(默认的认证方式是,用户名密码相同即通过认证),
1 |
< bean class = "org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" >
|
2 |
< property name = "dataSource" ref = "casDataSource" />
|
3 |
< property name = "sql" value = "select SYS_USER.SU_PASSWORD from SYS_USER where lower(SYS_USER.SU_NICKNAME_CODE)=lower(?)" />
|
使用上面这一段替换SimpleTestUsernamePasswordAuthenticationHandler,然后在配置文件中加入下面的数据源即可。
01 |
< bean id = "casDataSource" class = "org.apache.commons.dbcp.BasicDataSource" >
|
02 |
< property name = "driverClassName" >
|
03 |
< value >oracle.jdbc.driver.OracleDriver</ value >
|
06 |
< value >jdbc:oracle:thin:@192.168.0.141:1521:xe</ value >
|
08 |
< property name = "username" >
|
11 |
< property name = "password" >
|
然后,下载cas-server-support-jdbc.jar的源码,进行修改,下载链接http://grepcode.com/snapshot/repo1.maven.org/maven2/org.jasig.cas/cas-server-support-jdbc/3.3.5
解压,导入到eclipse,修改QueryDatabaseAuthenticationHandler,修改后的代码如下:
47 |
public void setSql( final String sql) {
|
然后,把各种依赖包导到build path里面去,让项目不报错。
打成jar包,放到cas server 的lib目录下面去即可。
4.修改登录界面和登录成功的界面
解决方法:cas\WEB-INF\view\jsp\default\ui
更改:casLoginView.jsp和casGenericSuccess.jsp
登录界面需要自己去套,form表单里面有些东西是不能更改的,否则会出现不能认证的情况。值得一提的是页面的外部css或者图片是放在cas\css和cas\images下面的。贴上我的页面以供大家参考:
01 |
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> |
02 |
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> |
03 |
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
04 |
<%@ page contentType="text/html; charset=UTF-8" %> |
05 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
06 |
< html xmlns = "http://www.w3.org/1999/xhtml" >
|
08 |
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
|
09 |
< title >EIP登录页面</ title >
|
10 |
< style type = "text/css" >
|
11 |
* { padding:0; margin:0;}
|
12 |
.eip-login{ width: 950px; height:700px; margin:auto;background:url(images/eip_login_bg.jpg) no-repeat;}
|
13 |
.eip-login-form { padding-left:684px;padding-top:353px;}
|
14 |
.eip-login-form input { border:0 none;}
|
15 |
.eip-login-box p { position: relative;margin-top: 10px;*margin-top:7px;margin-left: 30px;}
|
16 |
.eip-position-box { height:28px;line-height: 28px;width: 170px;color:gray; position:absolute;z-index:88;top:0;left:0px;font-size: 12px;display: inline-block;padding-left: 10px;cursor: text;}
|
17 |
.eip-username, .eip-password{ height: 22px; padding: 3px; line-height: 22px; width:170px;background:#f3f3f3;padding-left: 10px;}
|
18 |
.eip-submit { width:229px;height:47px;background:url(images/eip_login.png) no-repeat;margin-top: 15px;cursor: pointer;}
|
19 |
.eip-reset { margin-left:180px;cursor:pointer;background:#fff;}
|
21 |
< script type = "text/javascript" src = "js/jquery-1.72.js" ></ script >
|
22 |
< script type = "text/javascript" >
|
24 |
$(".eip-username").focus(function(){
|
25 |
var username = $(".eip-username").val();
|
26 |
if( username == '请填写EIP系统帐号(或花名)'){
|
30 |
$(".eip-username").blur(function(){
|
31 |
var username = $(".eip-username").val();
|
33 |
$(this).val('请填写EIP系统帐号(或花名)');
|
36 |
$(".eip-reset").click(function(){
|
37 |
$("#editForm").reset();
|
45 |
< form:form method = "post" commandName = "${commandName}" htmlEscape = "true" id = "edit-form" >
|
46 |
< div class = "eip-login" >
|
47 |
< div class = "eip-login-form" >
|
48 |
< div class = "eip-login-box" >
|
50 |
< c:if test = "${not empty sessionScope.openIdLocalId}" >
|
51 |
< strong >${sessionScope.openIdLocalId}</ strong >
|
52 |
< input type = "hidden" id = "username" name = "username" value = "${sessionScope.openIdLocalId}" />
|
54 |
< c:if test = "${empty sessionScope.openIdLocalId}" >
|
55 |
< form:input class = "eip-username" cssErrorClass = "error" id = "username" value = "请填写EIP系统帐号(或花名)" size = "25" tabindex = "1" accesskey = "${userNameAccessKey}" path = "username" autocomplete = "false" htmlEscape = "true" />
|
59 |
< form:password class = "eip-password" cssErrorClass = "error" id = "password" size = "25" tabindex = "2" path = "password" accesskey = "${passwordAccessKey}" htmlEscape = "true" autocomplete = "off" />
|
61 |
< input type = "hidden" name = "lt" value = "${flowExecutionKey}" />
|
62 |
< input type = "hidden" name = "_eventId" value = "submit" />
|
64 |
< div >< input class = "eip-submit" name = "submit" accesskey = "l" value = "" tabindex = "4" type = "submit" /></ div >
|
65 |
< div >< input class = "eip-reset" name = "reset" accesskey = "c" value = "重置" tabindex = "5" type = "reset" /></ div >
|
回头一看,其实整个配置也没多难,可是其中的过程却是曲折离奇。
如果大家有什么疑问可以留言,能够帮助解决的我会尽量解答的。
相关推荐
BPMX3是支持流程管理、监控、优化、再造的全套IT管理开发平台,并且集单点登录、企业单位门户、业务流程管理、开发、整合、业务分析及重构等多重职能于一身的软件开发工具和企业IT架构平台。 BPMX3是企业管理业务...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...
12.2.4 PM-EQM-SF-MPC 测量点和计数器 293 12.2.5 PM-EQM-SF-WA 保修 293 12.2.6 PM-EQM-SF-PMT 批准 294 12.3 PM-PRM-TL 任务清单 294 12.3.1 PM-PRM-MP 维护计划 295 12.4 PM-WOC-MN 维护通知 295 12.4.1 PM-WOC-...
CAS:逗号分开的ASCⅡ文件 CCB:Visual Basic动态按钮配置文件 CCH:Corel图表文件 CCO:CyberChat数据文件 CCT:Macromedia Director Shockwave投影 CDA:CD音频轨道 CDF:Microsoft频道定义格式文件 CDI:...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................