转自:http://hi.baidu.com/zh_m_zhou/blog/item/a56123071aeae77c02088196.html 引言: SSO,即Single sign on/off,单点登录/退出。 CAS,全称JA-SIG Central Authentication Service,实现SSO的开源项目。 说明: 在上篇中,我们完成了CAS在tomcat下的部署工作,下篇中,将以定制和扩展为主。 环境: Windows XP JDK1.5 Tomcat6.0 JBoss-4.2.2.GA MySQL5.0 准备: 完成上篇的操作流程 定制和扩展1:定制登录页面试图 1. 在目录“ cas_server/WEB-INF/view/jsp/default/ui ” 下 l casConfirmView.jsp: 当用户选择了“ warn ”时会看到的确认界面 l casGenericSuccess.jsp: 在用户成功通过认证而没有目的Service时会看到的界面 l casLoginView.jsp: 当需要用户提供认证信息时会出现的界面 l casLogoutView.jsp: 当用户结束 CAS 单点登录系统会话时出现的界面 2. 在目录“cas_server /WEB-INF/view/jsp/default/ui/includes ” 下 l top.jsp: 上述4个文件的头部文件 l buttom.jsp: 上述4个文件的尾部文件 3. 在目录“cas_server /WEB-INF/classes ”下 l 包含各个语言的porp文件(比较casLoginView.jsp文件) 4. 在目录“cas_server /js”下 l common_rosters.js(参见casLoginView.jsp文件注释) 5. 一切页面特调包括闪烁的效果都是css和js绑定标签id的效果,改动css文件或者修改id立可还原纯文本布局。 定制和扩展2:从tomcat移植到JBoss下 1. 完成基本配置,同tomcat下的相同,其中server.xml文件在目录jboss4.4/server/default/deploy/jboss-web.deployer目录下 2. Jboss的jsf和sun的jsf冲突,所以将jboss4.4/server/default/deploy/jboss-web.deployer/jsf-libs下的jsf-api.jar和jsf-impl.jar复制覆盖掉cas_server工程lib下的2个jar文件 注意事项:不要复制多余的jar到工程下,一旦与jboss下的jar发生重复的冲突,会报类型转换错误的error。 定制和扩展3:通过直接访问数据库定制密码验证 1. 在deployerConfigContext.xml文件中加入dateSource的Bean <bean id="casDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/portal" /> <property name="user" value="root" /> <property name="password" value="root" /> </bean> 2. 加入包: c3p0-0.9.1.jar mysql-connector-java-5.1.5-bin.jar cas-server-support-jdbc-3.3.1.jar(来自于cas-server-3.3.1.zip) spring-jdbc-2.5.5.jar 3. 在deployerConfigContext.xml文件中 注释掉: <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword 换成: <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="casDataSource" /> <property name="sql" value="select PWD from USER where lower(NAME) = lower(?)" /> <property name="passwordEncoder" ref=" passwordEncoder "/> </bean> 4. 新建类org.jasig.cas.authentication.handler.MyPasswordEncoder 添加: <bean id="passwordEncoder"
Date Base 按照xml中的配置,在本地搭建mySQL数据库,建立名为portal的schema,创建USER表,至少拥有字段NAME和PWD 以上操作完成CAS对密码校验的定制,通过读取MySQL数据库中指定的表字段,附带密码加密类,但不包括加密算法。(详见参考文档1) 定制和扩展4:登录验证之添加“用户不存在”错误信息 1. 类org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler (参考 “定制和扩展3”)在验证时,当用户名正确但密码错误时抛出特定Exception,比如抛出异常: org.jasig.cas.authentication.handler. BadPasswordAuthenticationException 2. 找到这个Exception类,将它的CODE值: 3. 以上,完成了一种错误信息的提示,你可以继续按照这个异常类创建更多的错误信息,提示如:“对不起,用户不存在!”之类各种错误信息。 定制和扩展5:定制Session返回用户ID CAS Server默认的是验证用户名和密码,验证成功后返回用户名到客户端。 假设,由于用户名不是唯一的,客户端希望在验证成功后返回用户ID,如何实现? 找到类org.jasig.cas.authentication.principal.UsernamePasswordCredentials 添加id属性及其getter,setter方法: private String userid;
public final void setUserid(String userid) { this.userid = userid; } 找到类org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver 注释代码: return usernamePasswordCredentials.getUsername(); 添加代码: return usernamePasswordCredentials.getUserid(); 类org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler (参考 “定制和扩展3”) 在必要的地方添加代码: credentials.setUserid("u85425"); 这样,客户端从session中取得的就将是"u85425"。 定制和扩展6:Cas Server的中文乱码问题 按照参考文档6操作,确认可行。其中协议为cas2.0,设置为gb2312。(详见参考文档6) 参考文档 1. 使用CAS在Tomcat中实现单点登录(定制和接口类的扩展) http://hi.baidu.com/leon1509/blog/item/990f7422c96deaa14623e823.html http://hi.baidu.com/leon1509/blog/item/28ca4e2c64f763e98a13992c.html 2. cas单点退出代码解读 http://www.blogjava.net/xmatthew/archive/2008/07/09/213808.html 3. cas单点退出代码Demo http://blog.sina.com.cn/s/blog_4aebeb1201008eg3.html 4. cas单点退出代码(好多文章啊 关键1:CAS Server需要3.1.2及以上版本) http://iroyce.javaeye.com/category/16769?show_full=true 5. CAS Logout 问题(关键2:要通过https退出) http://www.fish888.com/CAS-Logout-t133632 6. CAS Server的中文乱码解决方案 http://hi.baidu.com/mleoking/blog/item/982eb709ac76dcca3bc76306.html
<下篇完> |
<script></script>