CAS 系统介绍
CAS 是一个独立的 web 应用 , 当前使用 Java Servlets 实现,通过 HTTPS 协议保证其数据的传输安全性。 它通过三个 Url 地址进行访问:登录 Url、验证 URL、注销 URL。
安装 CAS:
解压缩以后,在其路径 cas-server-3.5.0\modules 下面找到 cas-server-webapp-3.5.0.war, 将其拷贝到 liferay 的服务器部署目录 liferay-portal-6.1.0-ce-ga1\tomcat-7.0.23\webapps 下, 改名为 cas.war, 并修改 war 包中配置文件 cas.properties 里的 cas server name=cas 并启动 liferay 服务器, 启动后可在浏览器访问 http://localhost:8080/cas/login
当出现如下界面时,说明 cas 服务器已经部署成功。如下图:
![图 4. CAS 服务器登录界面 CAS 服务器登录界面](https://i-blog.csdnimg.cn/blog_migrate/10e62250d07a40c521a9b79cefac39df.png)
package com.jinfonet.developer.portal;
import junit.framework.TestCase;
/**
*
*
*
*
*
*
*
* @author 88250 <DL88250@gmail.com>
*
*
*
*/
public final class AuthTest extends TestCase {
private final PasswordEncoder passwordEncoder = new Base64PasswordEncoder("SHA1");
public void testHashBase64Encoded() {
assertEquals("qUqP5cyxm6YcTAhz05Hph5gvu9M=", this.passwordEncoder.encode("test"));
}
public void testNullPassword() {
assertEquals(null, this.passwordEncoder.encode(null));
}
public void testInvalidEncodingType() {
final PasswordEncoder pe = new Base64PasswordEncoder("invalid encoding");
try {
pe.encode("test");
fail("exception expected.");
} catch (final Exception e) {
return;
}
}
}
package com.jinfonet.developer.portal;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//import org.inspektr.common.ioc.annotation.NotNull;
import org.jasig.cas.authentication.handler.PasswordEncoder;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Encoder;
/**
*
*
*
* @author 88250 <DL88250@gmail.com>
*
*/
public class Base64PasswordEncoder implements PasswordEncoder {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
// @NotNull
private final String encodingAlgorithm;
private String characterEncoding;
public Base64PasswordEncoder(final String encodingAlgorithm) {
this.encodingAlgorithm = encodingAlgorithm;
}
public String encode(final String password) {
if (password == null) {
return null;
}
try {
MessageDigest messageDigest =
MessageDigest.getInstance(this.encodingAlgorithm);
if (StringUtils.hasText(this.characterEncoding)) {
messageDigest.update(password.getBytes(this.characterEncoding));
} else {
messageDigest.update(password.getBytes());
}
final byte[] digest = messageDigest.digest();
return
getFormattedText(digest);
} catch (
final NoSuchAlgorithmException e) {
throw new SecurityException(e);
} catch (final UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
/**
*
* Takes the raw bytes from the digest and formats them correct.
*
*
*
* @param bytes
* the raw bytes from the digest.
*
* @return the formatted bytes.
*
*/
private String getFormattedText(byte[] bytes) {
final StringBuilder buf = new StringBuilder(bytes.length * 2);
sun.misc.BASE64Encoder e = new BASE64Encoder();
final String buf2 = e.encode(bytes);
for (int j = 0; j < bytes.length; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
System.out.println("Final: " + buf2);
System.out.println(encodingAlgorithm + ": " + buf);
return buf2.toString();
}
public final void setCharacterEncoding(final String characterEncoding) {
this.characterEncoding = characterEncoding;
}
}
假如报错的话
缺一个jar包 我当时是上cas网站找到一个jar包加入进去,把这个class编译了加入了cas-server-core-3.5.0.jar 当时编译时成功的,也能实现cas,以上代码是没有问题,就是liferay算法和cas的不同,cas的算法加密后是40位。liferay6.2加密后是48位,
所以登录不能成功
后来公司采用了 修改liferay hook文件的方式,实现了单点登录,以此记录一下。