liferay sso(转)

2.9分(超过30%的文档 523阅读 11下载 2011-03-25上传 2 21KB 展开

文库VIP新用户专享:首月仅需14元

开通VIP
VIP
liferay sso(转)
/ 2
来自
百度文库

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折起

工具特权无限次

开通VIP

仅需0.5元/天