2019独角兽企业重金招聘Python工程师标准>>>

参考文章http://www.ibm.com/developerworks/cn/opensource/os-cn-liferay-cas/index.html

发现使用该方法最后出现了空指针异常,修改了liferay部分源码实现了Digester,特此记录,给后来人方便。

在此我们采用和 Liferay 一致的默认加密算法“SHA”,在调用 Liferay 提供的加密算法时, 我们需要将 Liferay 的几个 jar 包引入到我们的 cas 工程中,自定义的加密算法也很简单, 只需要调用 jar 包中的加密工具类提供的加密算法即可,同时自定义的类需要继承 PasswordEncoder 接口:

使用maven管理的话,代码如下

<dependency><groupId>com.liferay.portal</groupId><artifactId>portal-service</artifactId><version>6.2.1</version>
</dependency>

其中CAS的加密配置中修改如下

<bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" p:dataSource-ref="dataSource"p:passwordEncoder-ref="myPasswordEncoder"p:sql="SELECT password_ FROM User_ WHERE screenName=?" /><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"p:driverClassName="com.mysql.jdbc.Driver"p:url="jdbc:mysql://127.0.0.1:3306/portal?useUnicode=true&amp;characterEncoding=utf-8"p:username="root"p:password="" /><bean id="myPasswordEncoder" class="passwordEncoder.MyPasswordEncoder"><constructor-arg value="SHA"/></bean><bean id="digesterUtil" class="com.liferay.portal.kernel.util.DigesterUtil"><property name="digester" ref="digester"></property></bean><bean id="digester" class="passwordEncoder.DigesterImpl"></bean>

DigesterImpl是Digester的实现。

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.security.pacl.DoPrivileged;
import com.liferay.portal.kernel.util.Base64;
import com.liferay.portal.kernel.util.Digester;
import com.liferay.portal.kernel.util.StreamUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;import org.apache.commons.codec.binary.Hex;/*** @author Brian Wing Shun Chan* @author Alexander Chow* @author Connor McKay*/
@DoPrivileged
public class DigesterImpl implements Digester {@Overridepublic String digest(ByteBuffer byteBuffer) {return digest(Digester.DEFAULT_ALGORITHM, byteBuffer);}@Overridepublic String digest(InputStream inputStream) {return digest(Digester.DEFAULT_ALGORITHM, inputStream);}@Overridepublic String digest(String text) {return digest(Digester.DEFAULT_ALGORITHM, text);}@Overridepublic String digest(String algorithm, ByteBuffer byteBuffer) {if (_BASE_64) {return digestBase64(algorithm, byteBuffer);}else {return digestHex(algorithm, byteBuffer);}}@Overridepublic String digest(String algorithm, InputStream inputStream) {if (_BASE_64) {return digestBase64(algorithm, inputStream);}else {return digestHex(algorithm, inputStream);}}@Overridepublic String digest(String algorithm, String... text) {if (_BASE_64) {return digestBase64(algorithm, text);}else {return digestHex(algorithm, text);}}@Overridepublic String digestBase64(ByteBuffer byteBuffer) {return digestBase64(Digester.DEFAULT_ALGORITHM, byteBuffer);}@Overridepublic String digestBase64(InputStream inputStream) {return digestBase64(Digester.DEFAULT_ALGORITHM, inputStream);}@Overridepublic String digestBase64(String text) {return digestBase64(Digester.DEFAULT_ALGORITHM, text);}@Overridepublic String digestBase64(String algorithm, ByteBuffer byteBuffer) {byte[] bytes = digestRaw(algorithm, byteBuffer);return Base64.encode(bytes);}@Overridepublic String digestBase64(String algorithm, InputStream inputStream) {byte[] bytes = digestRaw(algorithm, inputStream);return Base64.encode(bytes);}@Overridepublic String digestBase64(String algorithm, String... text) {byte[] bytes = digestRaw(algorithm, text);return Base64.encode(bytes);}@Overridepublic String digestHex(ByteBuffer byteBuffer) {return digestHex(Digester.DEFAULT_ALGORITHM, byteBuffer);}@Overridepublic String digestHex(InputStream inputStream) {return digestHex(Digester.DEFAULT_ALGORITHM, inputStream);}@Overridepublic String digestHex(String text) {return digestHex(Digester.DEFAULT_ALGORITHM, text);}@Overridepublic String digestHex(String algorithm, ByteBuffer byteBuffer) {byte[] bytes = digestRaw(algorithm, byteBuffer);return Hex.encodeHexString(bytes);}@Overridepublic String digestHex(String algorithm, InputStream inputStream) {byte[] bytes = digestRaw(algorithm, inputStream);return Hex.encodeHexString(bytes);}@Overridepublic String digestHex(String algorithm, String... text) {byte[] bytes = digestRaw(algorithm, text);return Hex.encodeHexString(bytes);}@Overridepublic byte[] digestRaw(ByteBuffer byteBuffer) {return digestRaw(Digester.DEFAULT_ALGORITHM, byteBuffer);}@Overridepublic byte[] digestRaw(String text) {return digestRaw(Digester.DEFAULT_ALGORITHM, text);}@Overridepublic byte[] digestRaw(String algorithm, ByteBuffer byteBuffer) {MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance(algorithm);messageDigest.update(byteBuffer);}catch (NoSuchAlgorithmException nsae) {_log.error(nsae, nsae);}return messageDigest.digest();}@Overridepublic byte[] digestRaw(String algorithm, InputStream inputStream) {MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance(algorithm);byte[] buffer = new byte[StreamUtil.BUFFER_SIZE];int read = 0;while ((read = inputStream.read(buffer)) != -1) {if (read > 0) {messageDigest.update(buffer, 0, read);}}}catch (IOException ioe) {_log.error(ioe, ioe);}catch (NoSuchAlgorithmException nsae) {_log.error(nsae, nsae);}finally {StreamUtil.cleanUp(inputStream);}return messageDigest.digest();}@Overridepublic byte[] digestRaw(String algorithm, String... text) {MessageDigest messageDigest = null;try {messageDigest = MessageDigest.getInstance(algorithm);StringBundler sb = new StringBundler(text.length * 2 - 1);for (String t : text) {if (sb.length() > 0) {sb.append(StringPool.COLON);}sb.append(t);}String s = sb.toString();messageDigest.update(s.getBytes(Digester.ENCODING));}catch (NoSuchAlgorithmException nsae) {_log.error(nsae, nsae);}catch (UnsupportedEncodingException uee) {_log.error(uee, uee);}return messageDigest.digest();}private static final boolean _BASE_64 = true;private static Log _log = LogFactoryUtil.getLog(DigesterImpl.class);}

最后一点,Liferay6.2.1最新版中,默认的加密方法不是SHA加密,需要配置文件

passwords.encryption.algorithm=SHA

Liferay中Portal.properties文件保存着Liferay很多的平台级的配置参数,通过在这里调整一些参数的配置信息,可以满足许多不同的需求。一般我们定义Portal.properties里面的配置文件是不直接修改的,按配置liferay可以加载以下路径下面的配置参数来覆盖默认的

  • include-and-override=portal-bundle.properties
  • include-and-override=${liferay.home}/portal-bundle.properties
  • include-and-override=portal-ext.properties
  • include-and-override=${liferay.home}/portal-ext.properties
  • include-and-override=portal-setup-wizard.properties
  • include-and-override=${liferay.home}/portal-setup-wizard.properties
  • include-and-override=portal-${easyconf:companyId}.properties
  • include-and-override=${liferay.home}/portal-${easyconf:companyId}.properties
  • include-and-override=${external-properties}
  • include-and-override=${liferay.home}/${external-properties}

也就是这些配置参数在上面的任一文件里面修改都可以。我们一般将自定义的配置参数放在下面的两个配置文件里面。

portal-setup-wizard.properties(在Liferay第一次运行的时候生成,默认是在liferay-portal-6.1.1-ce-ga2目录下面)

portal-ext.properties(在tomcat/webapps/ROOT/WEB-INF/classess下面,不存在可以自己创建)

转载于:https://my.oschina.net/u/1159248/blog/371246

Liferay6.2.1 集成 CAS4.0 实现单点登录与应用系统集成相关推荐

  1. cas6.0.4 单点登录

    sso单点登录cas6.0.4 单点登录原理(原来参考网上资料) 有一个独立的认证中心,只有认证中心才能接受用户的用户名和密码等信息进行认证,其他系统不提供登录入口,只接受认证中心的间接授权.间接授权 ...

  2. Oauth2.0实现单点登录的原理流程,这次总该懂了!

    单点登录是多域名企业站点流行的登录方式.本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程.同时总结了权限控制的实现方案,及其在微服务架构中的应用. 1 什么是单点登录 ...

  3. Oauth2.0实现单点登录的原理流程

    Oauth2.0实现单点登录的原理流程 1.什么是单点登录 2.OAuth2 认证授权的原理流程 3.基于 SpringBoot 实现认证/授权 4.综合运用 1.什么是单点登录 1.1 多点登录 传 ...

  4. Oauth2.0实现单点登录的原理流程,通俗易懂

    单点登录是多域名企业站点流行的登录方式.本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程.同时总结了权限控制的实现方案,及其在微服务架构中的应用. 1 什么是单点登录 ...

  5. Oauth2.0实现单点登录的原理流程,通俗易懂!

    点击上方☝码猿技术专栏 轻松关注,设为星标! 及时获取有趣有料的技术 单点登录是多域名企业站点流行的登录方式.本文以现实生活场景辅助理解,力争彻底理清 OAuth2.0 实现单点登录的原理流程.同时总 ...

  6. Shiro集成kisso,搭建单点登录系统

    kisso 是一个中间件,提供 cookie 搭建 java web sso 的组件式解决方案. shiro是目前比较常用的轻量权限控制框架. SpringBoot集成Shiro的文章比较多,我不多赘 ...

  7. 关于oauth 2.0和单点登录

    什么是oauth 2.0,在实际场景中解决了什么问题? oauth 2.0是开放授权协议,核心思想是授权第三方应用访问用户的受保护资源,并且是以令牌的方式进行访问而不是用户名和密码,保证了安全性:例如 ...

  8. OAuth2.0实现单点登录的原理

    一.什么是单点登录 单点登录,英文是 Single Sign On,缩写为 SSO.多个站点(192.168.1.20X)共用一台认证授权服务器(192.168.1.110,用户数据库和认证授权模块共 ...

  9. oauth2.0与单点登录

    1.什么是 OAuth2.0 OAuth (Open Authority的缩写)是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像.照片.视频等),而在这个过程中无 ...

最新文章

  1. P3175 [HAOI2015]按位或(Min - Max容斥,FMT,概率期望,全网最清晰的题解!)
  2. Xamarin.iOS真机测试报错
  3. 用OpenCV建立一幅只有几个像素且值可以自定义的图像,并输出保存到硬盘的方法
  4. ATen(A TENsor library for C++11)剖析(1)
  5. How to ignore files and directories in subversion?
  6. MVVM模式下实现拖拽
  7. php管理智能dns,负载均衡之DNS轮询
  8. 【渝粤教育】 国家开放大学2020年春季 1009离散数学(本) 参考试题
  9. 解决maven内存溢出
  10. 禁止用户打开控制台调试代码
  11. SQL.H 通过此文件寻找sqlAPI编程的一种捷径
  12. 虚拟机ping不通宿主机,宿主机能ping通虚拟机
  13. 初学 python 之 HAproxy配置文件操作
  14. Ubuntu 安装微信
  15. 为啥OpenStack厂商要参加双态运维大会?
  16. 广域网、城域网及局域网技术
  17. ShuffleNet在Caffe框架下的实现
  18. 实用:AE/PR 视频交换格式哪家强?
  19. 台式计算机怎么安装无线网卡,台式机用无线网卡,小编教你台式机怎么用无线网卡...
  20. html页面 关键字高亮,HTML高亮关键字的完美解决方案

热门文章

  1. 文件上传存至oracle,fileupload上传文件存储到oracle Blob字段中
  2. php小猫咪图床源码V1.8
  3. Joe博客模板Typecho主题
  4. 用 WebClient.UploadData 方法 上载文件数据
  5. 教你怎么获得ICM会员ID解析.xxx域名(membership id icm)
  6. 【jQuery插件】textSlider 文字滚动插件
  7. TSVD截断奇异值分解
  8. centos7搭建git代码仓库
  9. linux usb键盘驱动详解
  10. 数据结构---array