目录
Liferay开源门户系统之cas单点登录功能集成方法
一、概述
二、cas服务端配置
步骤1:准备好以下运行环境
步骤2:安装部署cas-server
步骤3:生成数字证书
步骤4:配制tomcat支持https协议
步骤5:测试
三、liferay支持cas的配置方法
四、其它web应用支持cas的配置方法
liferay是java中的一个开源门户系统,它实现了jsr268规范,基于java标准的portlet组件开发而成,是java界最流行的开源门户系统。
liferay已经提供了单点登录、权限控制、用户管理、页面布局等功能的支持,我们只需要做相应的定制,即可实现我们的需求。
liferay支持cas单点登录功能比较简单,只需要进入liferay的后台管理页面,填写cas服务端信息即可,难点就在cas服务端的部署与配置。因为cas服务端也是一个独立的web应用,且它与cas客户端的通信都是使用https协议,这就要求cas服务端需要提供一个非对称加密的数字证书,私钥导入到服务端的jre证书库,公钥导入到客户端的jre证书库中,这样才能安全的实现的单点登录功能。
获取数字证书有两种方式:一种是手动生成;一种是付费购买。
手动生成的数字证书是免费的,没有公信力,会被浏览器拦截并不推荐使用。
付费购买的数字证书具有公信力,浏览器不会拦截,但要收费。
为了便于测试,我将使用java提供的keytool生成数字证书。
步骤1:准备好运行环境
步骤2:安装部署cas-server
步骤3:生成数字证书
步骤4:配制tomcat支持https协议
步骤5:测试
jdk1.6+
tomcat6+
jdk与tomcat的下载、安装、配置在此略过。
到官网(http://downloads.jasig.org/cas/cas-server-3.5.0-release.zip)下载cas-server-3.5.0-release.zip。解压缩以后,在其路径 cas-server-3.5.0\modules 下面找到 cas-server-webapp-3.5.0.war, 将其拷贝到 tomcat 的webapps 下, 改名为 cas.war, 并修改 war 包中配置文件 cas.properties 里的 cas server name=cas 并启动 tomcat, 启动后可在浏览器访问 http://localhost:8080/cas/login
当出现如下界面时,说明 cas 服务器已经初步部署成功。
此时,还不能作为有效的单点登录服务器。在实际使用的时候,还需要根据实际概况做扩展和定制,最主要的是扩展认证 (Authentication) 接口和 cas-server的界面(这部分内容以后再详述)。其中红色部分提示当前登录的 cas 链接是不安全的,建议使用 https 协议。
打开cmd,进入jdk的bin目录,执行以下命令
生成证书
keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass 888888 -validity 365 -keystore e:\ssodemo.keystore -storepass 888888
注意:keypass与storepass密码要一致。
执行命令后,会让你填写一些基本信息,根据提示填写就行了,唯独“名称”一定要填写你的web访问域名,例如:localhost、baidu.com,否则使用会出错。
导出证书(证书导出后要给服务端与客户端使用)
keytool -export -alias ssodemo -keystore e:\ssodemo.keystore -file e:\ssodemo.crt -storepass 888888
导入证书(将证书导入到cas服务端使用的jre证书库,稍后cas客户端也要做此操作)
keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file e:\ssodemo.crt -alias ssodemo
注意:jdk的证书库路径在安装目录下的\jre\lib\security\cacerts
cas做为一个统一的单点登录平台,分为服务端和客户端。服务端就是刚刚部署好的cas-server,客户端则是一个jar包:cas-client-core-3.2.1.jar,此jar包封装了与cas服务端通信的全部过程。因此,要想让你的web应用接入cas统一登录平台,需要将cas-client-core-3.2.1.jar引入你的web应用,并做相应配置。liferay已经引入此jar包,无需我们手工再引入。通常我们将要接入cas单点登录的web应用,直称为“cas客户端”,因为相对于cas服务端来说,接入的都是客户端。
cas-client-core-3.2.1.jar下载地址:
http://downloads.jasig.org/cas-clients/cas-client-3.2.1-release.zip
打开tomcat的server.xml,加入以下配置,开启https协议:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="e:/ssodemo.keystore" keystorePass="888888"
clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"/>
参数说明:
keystoreFile 就是步骤3中创建证书的路径
keystorePass 就是步骤3中创建证书的密码
重启tomcat,访问https://localhost:8443/cas/login,出现如下页面则代表配置正确。
此处由于使用手动生成的数字证书,不具有公信力,被浏览器拦截,我们忽略它,点击“继续浏览此网站(不推荐)”,就可以正常使用了。正式使用时,推荐购买一个付费的证书,则不会出现此画面。
点击“继续浏览此网站(不推荐)”出现如下登录界面:
cas-server的默认验证规则:只要用户名和密码相同就认证通过(仅仅用于测试,生成环境需要根据实际情况修改),输入admin/admin 点击登录,就可以看到登录成功的页面:
看到上述页面表示CAS服务端已经完全部署成功。
liferay支持cas的配置方法相当简单,先将之前生成的证书ssodemo.crt导入到liferay使用的jre证书库中,导入方法与前述类似。然后启动liferay,进入控制面板->portal设置->认证->一般,用户如何认证,选择“按屏幕名称”。
选择cas,进行如下设置:
设置完毕后,点击“测试CAS配置”,出现如下图,则代表配置成功。
好啦!现在注销liferay用户,重新点登录,此时liferay跳到cas的统一登录平台,输入admin/admin,登录成功后,又跳回了liferay首页。
其它web应用支持cas的配置方法,就更加简单了。还是先将之前生成的证书ssodemo.crt导入到web应用使用的jre证书库中,导入方法与前述类似。再将cas-client-core-3.2.1.jar引入到web应用中,并在web.xml中加入以下配置即可。
<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://localhost:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value> http://localhost:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--
该过滤器负责实现HttpServletRequest请求的包裹,
比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
-->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</filter>
<!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== 单点登录结束 ======================== -->
参数:serverName是本web应用的访问域名