CAS sso单点登录 架设中问题及解决方案

<转>

 

1.CAS服务端用户登入如果是中文请求会乱码的问题

解决方案:CAS利用到spring,spring框架中提供了编码过滤功能,利用它可以解决请求乱码问题

 

2.CAS客户端和服务端中文传输乱码问题,虽然请求乱码问题解决了,但是这个问题还是会存在,可能是数据传输过程中引起的

解决方案:BASE64服务端加密,客户端解密(O(∩_∩)O~偶突发奇想来的)

 

3.中心同一个服务器,机房和办公室访问地址不同的问题(有的网站一个服务器有多个域名)

解决方案:重写CAS客户端CASFilter类,请注意,我们中心的CAS客户端和CAS服务端在同一服务器上的,我是针对这环境下写的

 

CAS架设环境

Windows
Tomcat 6.x
JDK 1.6
CAS server 3.34
cas-client-2.0.11(是耶鲁大学的那个版本,不是最新版,最新不一定最好,下载时请注意)

 

 

 

 

配置CAS服务端

部署cas-server

下载最新的cas-server-3.3.4.zip 服务器端,解压后找到cas-server-webapp.war,将这个war进行解压到tomcatwebapps目录下.

将刚才解压出的目录cas-server-webapp进行重命名为cas

启动tomcat 输入http://localhost:8080/cas/login 查看是否成功部署

下载地址: http://www.jasig.org/

推荐环境:JDK1.6 tomcat 6.0

配置数据源和身份验证

用户的认证信息通常保存在数据库中,我们这里使用的是jtds数据库连接。

将前面下载的cas-server-3.3.4.zip 包解开后,在 modules 目录下可以找到包cas-server-support-jdbc-3.3.4.jar,再下载个jtdsjar包,将两个包拷贝到cas\WEB-INF\lib目录下

DataStore 依赖于 spring.jar, commons-collections.jar, commons-dbcp.jar, commons-pool.jar

apachespring官方网找到这四个包把它们拷贝到cas\WEB-INF\lib

 

在 cas-server-support-jdbc-3.3.4.jar包中,提供了 个基于 JDBC 的 AuthenticationHandler,分别为 BindModeSearchDatabaseAuthenticationHandler, QueryDatabaseAuthenticationHandler, SearchModeSearchDatabaseAuthenticationHandler

我们这里使用的是QueryDatabaseAuthenticationHandler,它是通过配置一个 SQL 语句查出密码,与所给密码匹配

 

根据密码加密方式的不同,我们需要实现PasswordEncoder接口,来对输入的密码进行加密才能与数据库中的密码比较

 

建立一个项目,导入cas-server-core-3.3.4.jar

在项目中写个类实现org.jasig.cas.authentication.handler.PasswordEncoder接口中的public String encode(String arg0)方法,这是用来输入的密码加密的。

项目导出成jar包,拷贝到cas\WEB-INF\lib

 

 

 

根据不同的密码加密方式实现,我这里是MD5加密,下文仅为参考,请根据需求变化

新建个caspasskey项目

源码为

package org;

 

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

 

import org.jasig.cas.authentication.handler.PasswordEncoder;

 

public class MD5 implements PasswordEncoder {

 

@Override

public String encode(String arg0) {

MessageDigest digest = null;

if (digest == null) {

try {

 

digest = MessageDigest.getInstance("MD5");

catch (NoSuchAlgorithmException nsae) {

 

nsae.printStackTrace();

}

}

// Now, compute hash.

digest.update(arg0.getBytes());

 

 

byte[] bytes=digest.digest();

StringBuffer buf = new StringBuffer(bytes.length * 2);

for (int i= 0; i < bytes.length; i++) {

if (((int) bytes[i] & 0xff) < 0x10) {

buf.append("0");

}

buf.append(Long.toString((int) bytes[i] & 0xff, 16));

}

return buf.toString().toUpperCase();

}

 

}

 

导出为caspasskey.jar,拷贝到cas/WEB-INF/lib目录下

 

 

打开文件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 密码 from 用户表 where lower([用户名]) = UPPER(?)" />  

      <property  name="passwordEncoder"  ref="myPasswordEncoder"/></bean>

 

  <bean id="myPasswordEncoder"    class="org.MD5"/>  ---org.MD5这是我上文自定义的加密类

 

 

找到

<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl" />在它的下方添加以下数据源代码

<bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">     

<property name="driverClassName">        

<value>net.sourceforge.jtds.jdbc.Driver</value> 

  </property>    

       <property name="url"> 

<value>jdbc:jtds:sqlserver://数据库地址:1433/数据库名</value>

         </property>     <property name="username"> 

          <value>数据库访问用户名</value>     </property>   

            <property name="password">

              <value>数据库访问密码</value>

              </property>

              </bean>

 

到此,数据库与cas服务端的连接已完成,登入http://localhost:8080/cas/login,英文的用户名测试登入是否成功!

 

CAS服务端提交表单utf-8中文乱码解决方案

中文的用户名登入,默认情况下是乱码的,因为cas没有对请求进行utf-8编码

cas用到了spring的框架,我们可以直接利用spring的编码器进行utf-8编码

web.xml中添加

<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>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

需要注意的是,此配置需要在 <filter-mapping>

<filter-name>CAS Client Info Logging Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>的上方

 

再测试,发现中文可以登入了。

 

中文用户名客户端乱码解决方案

因为cas默认对中文是不支持的,在cas服务端与客户端之间,如果有中文存在,会有中文乱码的问题,虽然上文对请求进行了编码,但是客户端中文乱码的问题始终存在。为了避免中文乱码的存在,我的临时解决方案是在服务器端对中文进行base64加密,在客户端进行base64解密

 

找到org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver类的源代码,这个类在cas-server-core-3.3.4.jar包中

找到 protected String extractPrincipalId(final Credentials credentials)方法,将

return usernamePasswordCredentials.getUsername();

改为

return (new sun.misc.BASE64Encoder()).encode(usernamePasswordCredentials.getUsername().getBytes());

 

这样就可以在服务器端对所有用户名进行base64加密了

 

服务器端配置到此结束

 

Tomcat SSL安全验证

如果要实现CAS的单点登入,这是必须的

 

1. 生产密钥

点击开始à运行,输入cmd

进入控制台

Ø CD  X:\jdk根目录\Java\jdk1.6.0_14\bin

Ø CD X:

Ø 下文中导入过程密码统一使用changeit

keytool -genkey -alias cas-server -keyalg RSA -keypass changeit -storepass changeit -keystore casserver.keystore

输入密码后,在第一个提示输入姓名的时候,输入你的服务端地址或ip地址,localhost

国家输入CN

keytool -export -alias cas-server  -storepass changeit -file casserver.cer -keystore  casserver.keystore

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值