阅读已结束,获取文档需
(您持有 0 VIP文档下载特权)
加入文库VIP 本文免费下载
6亿VIP文档下载
千万文档免费下
付费文档8折起
工具特权无限次
文库VIP新用户专享:首月仅需14元
liferay sso
(转)
默认分类
2010-07-02 10:41:53
阅读
81
评论
0
字号:大中小
基于
Liferay
的
CAS SSO
实现思路
SSO
单点登录,基本上是做门户系统的必备工作之一。当我们用
Liferay
的时候,缺省已经
集成了
CAS
、
OpenID
、
LDAP
、
NTLM
、
OpenSSO
等单点登录的解决方案。
但
这些集成方案都有一个小问题,就是不能把用户管理跟
Liferay
自身的用户管理集成起
来。也就是说,我们必须要另外有一个用户管理的解决方案。尽管使用
LDAP
可能是更流
行的解决方案,但毕竟还是增大了我们的工作量,有没有就使用
Liferay
自身的用户管理的
SSO
集成方案?
本文就是试图来解决这个问题,主要基于以下几点来实现
SSO
。
使用
Liferay
的用户注册、管理作为统一用户的基础。
使用
CAS
作为单点登录的服务器端和客户端实现。
对
Liferay
做必要的定制,满足
SSO
客户端产品的要求。
CAS
的定制
下载的
CAS Server
,包括
Liferay
集成的
CAS Server
,都是只提供一个演示的登录验证,只
要输入帐号和密码相同就可登录成功。
我们使用
Liferay
的身份认证,需要做的第一件事情就是定制这个登录实现。
实现帐号密码验证的代码
在
CAS
中,
我们新写一个
Java
文件,
com.liferay.sso.cas.adaptors.LiferayAuthenticationHandler
,
继承
AbstractUsernamePasswordAuthenticationHandler
。
在这个类中,使用
JDBC
连接
Liferay
的数据库,实现帐号和密码的验证。其中,帐号使用
Liferay
中的
screenName
。
由于在
Liferay
中,
不同的
Company
可能会有相同的
screenName
,
因此这种实现方法会有一
些限制。最简单的做法,就是
Liferay
中只配置一个
Company
。
修改
CAS
配置文件
修
改
CAS
的
配
置
文
件
WEB-INF/deployerConfigContext.xml
,
修
改
<property
name="authenticationHandlers">
的内容。我的代码为:
<property
name="authenticationHandlers">
<list>
<bean
class="org.jasig.cas.authentication.handler.support.
HttpBasedServiceCredentialsAuthenticationHandler"/>
<bean
class="com.liferay.sso.cas.adaptors.LiferayAuthenticationHandler">
<property
name="dataSource" ref="liferayDbcpDataSource"/> </bean> </list> </property>
当然还需要一些配置数据库的代码,自行实现即可。
经过这两步,重新启动就可以用
Liferay
的帐号和密码进行认证了。
Liferay
的定制
作为用户的集中管理,
Liferay
还应该提供给客户端应用,能够很方便的得到用户的详细信
息,
CAS
本身是不解决这个问题的。
一个比较简单的做法,就是在
Liferay
中实现一个
Servlet
,根据用户
screenName
,得到用户
的详细信息。数据格式,为了适应不同的客户端应用,可以采用
XML
进行编码。
Cas
客户端的定制
CAS
自己提供的
Client
,
已经能满足用户认证的功能。
我们需要进一步定制的,
是解决
Auto
Login
和新用户创建的问题。这两点,需要在每个集成
CAS
的客户端应用中实现。
Auto
Login
,可以借鉴
Liferay
自己的一些
CasAutoLogin
,根据已登录的
Cas
用户,初始化
客户端应用所需要的一些
Session
信息。
CAS
中还有一个重要的问题,就是当
CAS
的用户在客户端不存在的时候,怎么解决。还有
一个更严重的问题,如果客户端已经有了用户,这时候怎么实现
Liferay
用户同本地用户的
映射?
Liferay
用户同本地用户的映射问题
用户映射,根据不同的系统,或者不同的用户需求应该有不同的实现方案。
使用相同的用户名
这是比较简单的做法,直接使用相同的用户名就行。当
SSO
的用户在本地应用中不存在的
时候,可以有两种解决方法:
允许用户映射本地已经存在的一个用户:
让用户输入一个帐号密码,
验证其本地合法用户的
身份,然后自动将本地用户名修改为
SSO
相同的用户名。如果在本地还没有账户,可以直
接使用第二种方案创建新用户。
直接创建新的本地用户:调用
Liferay
的获取用户的接口,获取用户的详细信息,然后直接
调用本地注册新用户的代码,创建一个本地新用户。
这两种情况下,下次用户登录时,直接根据相同用户名进行用户映射即可。
客户端应用自己保存用户映射
如果客户端应用不修改本地用户的用户名,
可以添加代码,
在本地实现一个用户的映射机制。
比如将
SSO
的
user1
,映射为客户端的用户
user2
。
当然这种实现,也需要提供一个本地的用户验证机制,实现用户的正确映射。
在
Liferay
中添加用户映射的机制
考虑到有很多产品需要集成,
如果每个产品都去实现用户映射,
工作量比较大,
可以考虑到
Liferay
中实现一个统一的映射机制。
这种实现,也需要提供一个本地的用户验证机制,实现用户的正确映射。
这时候,需要做的工作有几部分:
新建一个数据表,用以保存
SSO
用户和各个产品的用户之间的映射机制。
在
Liferay
中定制的获取用户信息的接口中,添加用户映射的信息。这样,
SSO
客户端读取
用户信息时,能够直接读取到用户在本地的用户名。
Liferay
中添加一个接口,由客户端调用,用于保存用户映射信息。
阅读已结束,获取文档需
(您持有 0 VIP文档下载特权)
加入文库VIP 本文免费下载
6亿VIP文档下载
千万文档免费下
付费文档8折起
工具特权无限次