如何利用TAM的API进行应用的开发

在下面的文章中,我们会介绍应用如何利用IBM Tivoli Access Manager(以下简称TAM)作为用户认证和授权控制的平台,最为高效地把TAM和应用开发集成起来,从而为应用的开发、部署和运行提供一个高效可靠的安全平台。

随着电子商务时代的到来,各种各样的业务已经从传统的面对面的运营方式变成了通过互联网,直接通过网络进行交易的运营方式。因此,如何更好地控制用户对后台关键应用的访问就显得尤为重要。

 

TAM的结构简介

 

    tam的授权模型

  

 

如上图所示,TAM的授权模型来自于业界标准的ISO10181的授权模型,在TAM的授权模型中,包括有几个重要的功能模块,他们分别是用户注册库、策略管理器、对象库和规则、策略执行者。下面我们分别对这几个主要的功能模块进行详细的介绍。

 

用户注册库

 TAM中的用户注册库需要建立在一个标准的LDAP服务器上,他现在支持业界中几乎所有的LDAP服务器,例如:IBM Directory Server、Lotus Domino Directory、MS Active Directory、SUN iPlanet Directory Server、Novell eDirectory;或者任何支持标准LDAP协议的LDAP服务器。

TAM中的用户注册库主要用于存储用户的相关信息,例如:用户名、用户密码、邮件地址、电话、通信地址等和用户相关的信息。

 

策略管理器

TAM中的策略管理器是TAM的核心部分。它负责和其它TAM功能模块的通讯工作,其中主要包括以下几个功能

  • 维护TAM中的主要信息(例如:用户信息、对象库(Protected Object Space)、访问控制列表(ACL)等)
  • 保存着其它TAM功能模块的位置信息

 

对象库和规则



 策略执行者

TAM中的策略执行者是用户访问TAM后台资源的唯一渠道,所有用户访问后台资源的请求都必须通过策略执行者,策略执行者会对用户的身份进行确认,同时还会对用户的访问请求作授权的判断。如果访问请求得到批准的话,策略执行者会把用户的请求转发给后台的应用,并且把后台应用答复给用户的信息转发给用户。如果访问请求没有被批准的话,他会直接拒绝用户的访问请求,并且不做任何访问请求的转发。

 

TAM和应用的集成

 

       TAM和应用集成的优势

 

应用和TAM的集成,或者说在应用开发时利用TAM的安全平台来做应用安全部分的开发,有以下几点优势:

 

  • 首先,TAM是一套非常成熟和完整的3A系统(认证、授权和审计),它可以和几乎所有的Web服务器和Web应用服务器进行无缝的集成。
  • 其次,TAM提供了一套完整的、应用开发时需要的用户认证、授权和管理API,(包括有C/C++和JAVA语言),因此在应用开发时可以直接使用这些API进行用户认证和操作授权的操作,或者TAM系统的管理工作。
  • 第三,TAM有一套完整的用户管理、资源管理的体系架构。应用开发时,可以直接使用TAM提供的这套管理体系作为应用的用户管理和资源管理架构,而不需要自己另外建立一套这样的架构。
  • 第四,TAM有一套完整的用户授权判定机制,他所提供的功能非常完备。包括了授权控制中的每一个细节,应用开发时,可以通过API直接使用TAM提供的这套授权判定机制作为自己应用的授权判定模块。
  • 第五,和TAM的其他模块(例如:WebSEAL、AMOS、AMBI等)的共同使用可以为企业建立一套最为完整的安全框架结构,从操作系统的每个文件、每个TCP连接到Web服务器上的一个静态或者动态页面,到Web应用服务器上的每个Servlet,甚至于Servlet中提供的某个方法,或者更为细化的授权判定,都可以通过TAM提供的安全平台来实现。

 

总而言之,通过和TAM的集成,应用开发的步骤可以大大地加快,应用的安全结构会变得更为安全和可靠。应用开发时只要关注和业务相关的部分就可以了,安全部分的内容可以全部交给TAM的平台进行管理和控制。

 

TAM和应用集成的结构

当应用使用C或者JAVA语言作为应用的开发语言时,TAM可以使用用户的认证和授权API来对用户作身份的确认和访问权限的判定。

 

当和Web环境共同存在时,为了更好地保护Web环境中的资源以及和后台应用的集成,WebSEAL发挥了极大的安全控制功能,作为一个策略执行者,WebSEAL位于所有Web服务器和Web应用服务器之前,他会处理用户身份的认证和URL级别的访问授权判定。同时,还会根据后台web服务器和web应用服务器的要求,把用户的相关信息(例如:用户的邮件地址、用户的联系方式等信息)通过HTTP Header传到后台的Web服务器和Web应用服务器,以便后台应用的操作。后台应用(例如:WebSphere Application Server上的Servlet)可以从HTTP Header中获得用户的信息,然后利用TAM提供的授权API对用户的访问请求作出更为细化的授权判定。



 

 

建立自己应用的Action

用户可以对应用中的资源所作的操作在TAM中叫做Action。TAM本身带有17种默认得Action定义,例如:Add、Browse、Control、 Delete、Delegate、Modify、Create、Read等。

 

为了满足应用开发的要求,应用开发人员可以在TAM中定义自己应用需要的Action定义,例如:Access、Forward、Pass等。

建立自己应用的Protected Object Space

 

Protected Object Space是一个逻辑的、能够反映被保护资源的结构定义。例如:对于Web服务器来说,它上面的资源就是每个静态或者动态的页面;对于操作系统来说,它上面的资源就是一些重要的文件、TCP端口等。对于应用来说,Protected Object Space实际上应该根据具体的应用资源结构来定义,它可以是数据库中的某个表,或者应用系统的某个纪录等,这些资源结构的定义是一种逻辑上的定义,定义的对象可以实际存在,也可以完全不存在,它可以只是一种虚拟的定义。

 

在应用中使用TAM提供的认证和授权API

TAM提供了全面的用于应用开发的认证和授权API,应用的开发人员可以使用这些认证和授权API作为系统的用户认证和访问授权架构。当对用户访问权限作判定时,它完全遵循TAM的授权模型提出授权请求并且得到授权判定的最终结果。下面是几个用于用户认证和授权管理的方法,

PDPrincipal whoIsIt = new PDPrincipal( _who , _pwd);

- 获得用户信息

PDPermission whatTheyWant = new PDPermission( _object, _perms );

- 获得用户想要访问的对象和相应的操作

boolean haveAccess = whoIsIt.implies(whatTheyWant);

 

- 提出授权判定的请求(谁<_who>想对对象<_object>作操作<_perms>),并且获得授权判定的结果

在应用中使用TAM提供的管理API

TAM除了提供了用于用户身份认证和访问授权管理的API以外,还提供了功能全面的TAM管理API,通过这些API可以对TAM的系统进行全方面的管理,例如:用户的添加、对象库中信息的修改、访问控制列表(ACL)的修改等功能。应用开发人员甚至可以利用TAM提供的管理API开发一套自己特有的TAM系统的管理工具,以方便对TAM提供更为灵活和客户话的管理工具。下面是几个用于管理用户的方法,TAM提供的管理API多达几百个,可以完全覆盖所有的TAM管理工作。

 

  • PDUser.createUser
  • PDUser.importUser
  • PDUser.deleteUser
  • PDUser.listUsers

一个和应用集成的配置实例

下面我们介绍一个TAM和应用开发集成的配置实例,在这个实例里,我们会使用到TAMeb、WebSEAL、IBM HTTP Server、WebSphere Application Server。在这个环境中,我们使用4台硬件服务器,分别作为以上4个应用的运行环境。下面是这4台硬件服务器的配置例子:


 

一个利用TAM提供的API进行开发的程序实例

在安装完TAM和相应的ADK模块之后,在TAM的安装目录下会有几个C和JAVA的实例可以作为参考。另外,TAM的电子文档里有4本书专门介绍如何利用TAM提供的API进行应用开发,以及TAM提供的API的使用方法。

 

下面是利用TAM提供的API做的一个Servlet,可以作为大家应用开发的一个参考。

 

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;
import java.net.URL;
import com.tivoli.pd.jutil.PDContext;
import com.tivoli.pd.jutil.PDMessage;
import com.tivoli.pd.jutil.PDMessages;
import com.tivoli.pd.jutil.PDRgyUserName;
import com.tivoli.pd.jutil.PDRgyGroupName;
import com.tivoli.pd.jutil.PDException;
import com.tivoli.pd.jadmin.*;
import com.tivoli.pd.nls.pdbjamsg;
import com.tivoli.mts.*;


public class AMServlet extends HttpServlet {
  //**
  //** init( ServletConfig config )
  //**
  public void init( ServletConfig config ) throws ServletException	{
    super.init( config );
  }


  //**
  //** destroy()
  //**
  public void destroy() {
    super.destroy();
  }


  //**
  //** doGet( HttpServletRequest req, HttpServletResponse resp ) 
  //**
  public void doGet( HttpServletRequest req, HttpServletResponse resp )
  throws ServletException, IOException {
    processRequest( req, resp );
  }


  //**
  //** doPost( HttpServletRequest req, HttpServletResponse resp ) 
  //**
  public void doPost( HttpServletRequest req, HttpServletResponse resp )
  throws ServletException, IOException {
    processRequest( req, resp );
  }

 
  //**
  //** processRequest( HttpServletRequest req, HttpServletResponse resp )
  //**
  public void processRequest( HttpServletRequest req, HttpServletResponse resp )
  throws ServletException, IOException {
    PrintWriter pw = resp.getWriter();
    pw.println( "<HTML>" );
    pw.println( " <BODY>" );
	try
	{
	      PDMessages msgs = new PDMessages();
	      String adminName = "sec_master";
		String adminPwd = "passw0rd";
	      char [] adminPassword = adminPwd.toCharArray();
	      String configURLStr = "file:///E:/WebSphere/AppServer/java/jre/PdPerm.properties";
	      String rgySuffix = "dc=zk,dc=com";
	      Locale locale = new Locale("ENGLISH", "US");
	      URL configURL = new URL(configURLStr);
		
		pw.println("<H1>Tivoli Access Manager Admin API Example</H1>");
		pw.println("<H3>Creating a context...\n</H3>");
		pw.println("<BR>");
		PDContext ctxt = new PDContext (locale,adminName,adminPassword,configURL);

		pw.println("<H3>Listing the users...\n</H3>");
		pw.println("<BR>");
		ArrayList userList = PDUser.listUsers(ctxt,PDUser.PDUSER_ALLPATTERN,PDUser.PDUSER_MAXRETURN,false,msgs);
		pw.println(userList);
		pw.println("<BR>");

		pw.println("<H3>Showing the user sec_master...\n</H3>");
		pw.println("<BR>");
		String name="sec_master";
		PDUser pdUser = new PDUser(ctxt,name,msgs);
		pw.println("<H3>Account Valid: </H3>" + pdUser.isAccountValid());
		pw.println("<BR>");
		pw.println("<H3>Account Description: </H3>" + pdUser.getDescription());
		pw.println("<BR>");
		pw.println("<H3>Account Registry Name: </H3>" + pdUser.getRgyName());
		pw.println("<BR>");
		pw.println("<H3>Account ID: </H3>" + pdUser.getId());
		pw.println("<BR>");
		pw.println("<H3>Account First Name: </H3>" + pdUser.getFirstName());
		pw.println("<BR>");
		pw.println("<H3>Account Last Name: </H3>" + pdUser.getLastName());
		pw.println("<BR>");
		pw.println("<H3>Account Policy: </H3>" + pdUser.getPolicy());
		pw.println("<BR>");
		pw.println("<H3>Account Group: </H3>" + pdUser.getGroups());
		pw.println("<BR>");
		pw.println("<H3>Account PD User: </H3>" + pdUser.isPDUser());
		pw.println("<BR>");
		pw.println("<H3>Account SSO: </H3>" + pdUser.isSSOUser());
		pw.println("<BR>");

	}
	catch (PDException e){}
	catch (Exception e){}

      String _who="sec_master";
      String _object="/Management";
      String _pwd="passw0rd";
      String _perms="T";
	
	PDPrincipal whoIsIt = new PDPrincipal( _who , _pwd.toCharArray() );
	PDPermission whatTheyWant = new PDPermission( _object, _perms );
	boolean haveAccess = whoIsIt.implies(whatTheyWant);

	pw.println("<H1>Tivoli Access Manager Authorization API Example</H1>");
	pw.println( "[" + _who + ", " + _object + ", " + _perms + "] --> " );
	if (haveAccess)
		{pw.println( "Access is Granted: " );}
	else
		{pw.println( "Access is Denied: " );}

    pw.println( " </BODY>" );
    pw.println( "</HTML>" );
  }

}

 

 

 

猜你喜欢

转载自yanjunjie.iteye.com/blog/2261026