Jetspeed2.0的安全架构为保护门户内的各种资源提供了一套广泛的安全服务。这套安全服务是完全独立于其他的门户服务,甚至可以从门户应用中抽取出来。这套机制的核心部分是依靠JAAS提供的认证,授权功能。Jetspeed2.0的安全服务是建立在一套安全模块和扩展安全模块上的,并提供了一个SPI模型。通过修改和配置特定的处理方式,使用这个SPI模型可以修改系统内部提供的一些安全服务(比如用户管理,角色管理,用户组管理)。
JAAS
简介
Java Authentication Authorization Service
(
JAAS
,
Java
验证和授权服务)提供了灵活和可伸缩的机制来保证客户端或服务器端的
Java
程序。
JAAS
强调的是通过验证谁在运行代码以及他/她的权限来保护系统免受用户的攻击。它让你能够将一些标准的安全机制,例如
Solaris NIS
(网络信息服务)、
Windows NT
、
LDAP
(轻量目录存取协议),
Kerberos
等通过一种通用的,可配置的方式集成到系统中。
使用
JAAS
的好处在于通过在应用程序和底层的验证和授权机制之间加入一个抽象层,可以简化涉及到
Java Security
包的程序开发。抽象层独立于平台的特性使开发人员可以使用各种不同的安全机制,而且不用修改应用程序级的代码。
JAAS
通过一个可扩展的框架:服务提供者接口(
Service Provider Interface
,
SPI
)来保证程序独立于安全机制。服务提供者接口是由一组抽象类和接口组成的。其中主要的接口有
LoginContext
,应用程序级的代码主要调用这个接口。在
LoginContext
下面是一组动态配置的
LoginModules
。不同的
LoginModule
使用具体的安全机制进行验证,这些安全模块可以堆叠在一起使用。
架构(
Architecture
)
Jetspeed2.0内部实现了一个缺省的LoginModule和一个缺省的授权策略。认证通过后会创建用户的唯一标示,并且将用户所有的主体(principal)组装成一个主题(subject)。然后通过主题中的主体信息使用AccessController来判断用户可以访问那些资源。
下图是Jetspeed2.0的安全架构图:
http://portals.apache.org/jetspeed-2/multiproject/jetspeed-security/images/arch-overview.gif
认证(
Authentication
)
Jetspeed2.0内部提供一个缺省的Login Module来验证用户有效性,用关系数据库存放用户信息。Login Module验证用户是通过内部服务UserManager实现的,UserManager提供了一套简单的用户认证和管理服务。比如获得某个组名或某个角色名下的用户;设置新的密码;设置密码有效期等。认证SPI具体实现了用户主体和凭证的管理,是内部服务UserManager功能的具体实现。
认证SPI包含四个组件:
AuthenticationProviderProxy——认证供应者的代理,根据用户返回相应的认证供应者。
AuthenticationProvider——提供用户认证和管理的具体实现。目前在Jetspeed2.0中有两种方式:RDBMS和LDAP,通过配置可实现复合的认证方式。
CredentialHandler——安全凭证处理,分为DefaultCredentialHandler(关系数据库)和LdapCredentialHandler。
UserSecurityHandler——用户安全信息的持久化,分为DefaultUserSecurityHandler(关系数据库)和LdapUserSecurityHandler。
在缺省的凭证处理中增加了一些密码管理功能。如:
•提供可定制的密码凭证实现
•密码加密
•密码有效性校验
•控制凭证生命周期
•密码的拦截机制:如果定义了会在以下几种情况调用拦截机
o从持久层从新装载一个凭证之后
o验证了一个用户后
o在一个新的凭证被保存到持久层之前
o在一个新的密码被保存到凭证之前
o校验密码有效时
o当凭证装载需要密码加密时
o当密码超过生命周期时
o密码认证超过最大次数时
o当强迫使用新的密码代替旧密码时
授权(
Authorization
)
Jetspeed2.0使用关系数据库存储主体和权限之间的关系,实现了自己定义的安全策略。在这里需要说明三个概念:
权限(permission):动作与资源的关系
主体(principal):系统中实体的描述。这里有三个主体用户;角色;组
策略(policy):主体与权限之间的关系
下面是一些举例:
grant principal o.a.j.security.UserPrincipal "theUserPrincipal" {
permission o.a.j.security.PagePermission "mypage", "view";
permission o.a.j.security.PortletPermission "myportlet", "view,edit,minimize,maximize";
permission o.a.j.security.TabPermission "mytab", "view";
};
grant principal o.a.j.security.RolePrincipal "theRolePrincipal" {
permission o.a.j.security.PagePermission "mypage", "view";
permission o.a.j.security.PortletPermission "myportlet", "view,edit,minimize,maximize";
permission o.a.j.security.TabPermission "mytab", "view";
};
grant principal o.a.j.security.GroupPrincipal "theGroupPrincipal" {
permission o.a.j.security.PagePermission "mypage", "view";
permission o.a.j.security.PortletPermission "myportlet", "view,edit,minimize,maximize";
permission o.a.j.security.TabPermission "mytab", "view";
};
在使用时是通过用户的主体来判断用户的使用权限的,因此当执行一个访问控制检查时应该是这样调用的:doAsPrivileged(theSubject, anAction, null)。在这里AccessContolContext是ull,这就说明并不需要知道谁来调用的,重要的是给定的用户的主体是否有权访问此资源。
在Jetspeed2.0里定义了一个内部服务PermissionManager来管理主体与权限间的关系。权限和主体都对应一个对象并且与一个表对应。主体是InternalPrincipal类对应表SECURITY_PRINCIPAL;权限是InternalPermission类对应表SECURITY_PERMISSION;他们之间是多对多关系,存放在表PRINCIPAL
_
PERMISSION中。
授权SPI实现了用户,角色,组之间的关系,提供RoleManager和GroupManager管理角色和组。同时角色或组是由继承关系的,继承关系分为普通和集合两种:普通就是后一个拥有前一个的权限,即子拥有父的;集合就是高一级的拥有低一级的权限。
配置(
Configuration
)
Jetspeed2.0中缺省的安全机制使用关系数据库来存储安全信息。所有的SPI配置文件都在 ${jetspeed-source-home}/portal/src/webapp/WEB-INF/assembly/ 目录下
.security-atn.xml——配置login module
.security-atz.xml——配置授权策略
.security-managers.xml——配置安全管理员
.security-providers.xml——配置各种Provider和相关的SPI
.security-spi.xml——配置通用的认证、授权SPI
.security-spi-atn.xml——配置所有的认证SPI
.security-spi-atz.xml——配置所有的授权SPI
所有的配置文件信息请参考相关文档
总结
Jetspeed2.0使用JAAS安全框架实现了一个良好的安全机制,整个框架体系简单明了,具有很好的扩展性和可移植性。基于角色的访问控制(RBAC)支持多层继承策略,使在应用部署时具有很高灵活性。目前在内部的安全服务处理上还相对简单,在具体应用时还需要完善。