Liferay的CAS SSO实现思路

来源:百度文库 编辑:神马文学网 时间:2024/04/28 06:33:21
 

基于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,修改的内容。我的代码为:

HttpBasedServiceCredentialsAuthenticationHandler"/>

当然还需要一些配置数据库的代码,自行实现即可。

经过这两步,重新启动就可以用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中添加一个接口,由客户端调用,用于保存用户映射信息