Liferay版本: SDK:liferay-plugins-sdk-6.1.1-ce-ga2-20120731132656558 绑定tomcat版本:liferay-portal-tomcat-6.1.1-ce-ga2-20120731132656558CAS版本: cas-server-3.5.0-release数据库: MySql 5.1 实现步骤:1.部署cas服务器 将cas-server解压,将modules目录下的cas-server-webapp-3.5.0.war拷贝到liferay绑定的tomcat的webapps目录下,并改名为cas.war此时在地址栏输入http://localhost:8080/cas/login,就进入到CAS的登录界面,只要用户名和密码相同就进入验证通过界面如下图:此时,CAS 还不能作为有效的单点登录服务器红色部分的提示当前登录的 CAS 链接是不安全的,建议使用 https 协议,这里将使用 http 协议对 CAS server 进行配置2.取消 CAS 服务器 HTTPS 认证方式 2.1 在liferay绑定的tomcat\webapps目录下直接用压缩软件打开cas.war,修改cas\WEB-INF\spring-configuration \ticketGrantingTicketCookieGenerator.xml 配置文件,将 p:cookieSecure="true” 改为 p:cookieSecure="false" ,改完后如下: 2.2 修改 cas\WEB-INF\spring-configuration\warnCookieGenerator.xml 配置文件,将 p:cookieSecure="true” 改为 p:cookieSecure="false" ,改完后如下: 2.3 修改 cas\WEB-INF\deployerConfigContext.xml: 找到"HttpBasedServiceCrede ntialsAuthenticationHandler" bean (117行左右)添加:p:requireSecure="false", 改完后如下: 这样,在 cas 服务器运行的时候,就可以只使用 http 请求了。
3.集成方式说明 CAS 作为单点登录的认证服务器,在收到页面传递的登录请求以后,将请求转发到 CAS 服务器后端进行验证,在未经配置的时候, 只要输入的密码和用户名称一致,则验证通过在实际的使用中当然这样是不可行的在此我们要对用户输入的用户名称和密码做校验 如果存在该用户,并且密码正确则说明验证通过 这里就有了两个问题:第一,CAS 需要连接到存储用户信息的数据库才能读取到用户信息 第二,验证密码的加密算法必须和数据库存储密码的加密方式一致基于此文采用的方式,对于第一个问题, 我们将直接使用 CAS 服务器连接到 Liferay 安装的数据库,直接读取 Liferay 门户的用户信息 对于第二个问题,我们将直接调用 Liferay 中的加密算法对用户输入的密码进行加密,然后与数据库中的加密密码进行比对 这样就可以保证 CAS 服务器在进行用户认证时,可以和 Liferay 服务器使用的用户保持一致4. CAS 配置4.1 配置 dataSource 在cas\WEB-INF\deployerConfigContext.xml中添加dataSource bean: 如下图:修改时注意:数据库选liferay的数据库,dataSource bean要在标签中间4.2 配置cas.properties host.name=cas server.prefix=http://localhost:8080/cas database.hibernate.dialect=org.hibernate.dialect.MySQLDialect 5. 加密方式修改5.1说明CAS 默认使用了一套简单的密码验证,在 deployerConfigContext.xml 配置文件中,为认证管理接口 authenticationManager 配置了属性 authenticationHandlers 处理器, 其中: 就是默认的认证处理逻辑,我们可以在下载到的压缩包找到他的源代码:cas-server-core\src\main\java\org\jasig\cas\authentication\handler\support\SimpleTestUsernamePasswordAuthenticationHandler.java, public boolean authenticateUsernamePasswordInternal (final UsernamePasswordCredentials credentials) { final String username = credentials.getUsername(); final String password = credentials.getPassword(); if (StringUtils.hasText(username) && StringUtils.hasText(password) && username.equals(getPasswordEncoder().encode(password))) { log.debug("User [" + username + "] was successfully authenticated."); return true; } log.debug("User [" + username + "] failed authentication"); return false; }默认的用户名和密码认证方式是只要校验用户名和密码相同,则认证通过。
因此我们要对这种认证方式进行修改, 改为用户名和密码都采用 Liferay 中用户的校验方式将默认的认证类注释掉,配置提供的 jdbc 认证5.2 配置自定义 JDBC 认证方式 属性 sql 配置为查询 Liferay 数据库表 user_,字段 password_ 和 screenName 其中 passwordEncoder 是对清单 7 中设置的实际加密器类的引用。
为了使用 Liferay 的密码加密方式,我们需要配置一个我们自己开发的密码加密类5.3 指定具体加密类和加密算法 在此我们采用和 Liferay 一致的默认加密算法“SHA”,在调用 Liferay 提供的加密算法时, 我们需要将 Liferay 的几个 jar 包引入到我们的 cas 工程中,自定义的加密算法也很简单, 只需要调用 jar 包中的加密工具类提供的加密算法即可,同时自定义的类需要继承 PasswordEncoder 接口5.4 自定义加密算法类package com.test.portal.cas;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import javax.validation.constraints.NotNull; import org.jasig.cas.authentication.handler.PasswordEncoder; import org.springframework.util.StringUtils;import sun.misc.BASE64Encoder;public final class MyPasswordEncoder 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 MyPasswordEncoder(final String encodingAlgorithm) { this.encodingAlgorithm = encodingAlg。