采用dsapi开发domino登录认证

dsapi开发domino登录认证的资料十分少,但是官方的资料讲解的很详细,要编写dsapi程序看官网的介绍十分必要,但是官网的资料仅仅提供了一个简单的登录demo的示例,复杂的功能还需要自己配合api去琢磨研究,现将自己研究的做一个记录。

1.domino环境配置介绍

A.软件下载地址

我们需要下载的lotus domino的软件包包括:

1)DOMI_SRV_9.01WIN_64_EN_FULL_-TRIAL(Lotus server9.0.1安装包)

这个是domino的核心组件,里面包括了domino server(用于首次配置服务参数、启动服务)和domino console(用于查看日志输入、命令行方式控制相关功能的开启,比如http服务的开停),如下图:

     

下载地址:http://www.ibm.com/developerworks/cn/downloads/ls/lsds/ (下面的地址链接为“下载试用版”的链接)

https://www-01.ibm.com/marketing/iwm/iwm/web/reg/pick.do?source=ESD-NTSDOMTRL&S_TACT=109HD0PW&S_CMP=dwchina&lang=zh_CN

由于IBM网站下载软件,需要用已注册过的账号登录,故首次访问该地址会弹到登录页面,如下图:


登录后,会进入到下载页面,如下:


2)ND_Dgr_Admin_9.0.1_Wins_SC_DWks(domino admin工具包)这个工具主要用于用户方便配置domino服务

下载地址为:http://www.ibm.com/developerworks/downloads/ls/dominodesigner/

安装后图标为:

        

domino admin用于配置服务器,domino designer用于编写网页等

domino admin进入之后可以看到其可以配置


3)lotus notes

下载地址同1)一致,可以在页面靠后位置看到客户端工具包,如下图:


安装后图标为:


B.软件安装配置

1)domino server的安装配置

安装很简单,一直根据安装向导点击下一步即可,在此简单说一下配置

domino server的配置也基本是点击下一步即可,但是在如下的页面中需要用户输入密码、域名等,需要注意一下,配置如下图:






服务配置好后,可以通过domino console进行登录查看后台日志,如下图:



2)domino admin安装配置
安装向导默认是不安装domino admin的需要我们将其选择上,如下图所示:


注:本人在安装domino designer的时候,出现了 “Domino Designer 试图升级多用户安装问题” ,解决方法是MultiUser值改为0,如下图所示:

造成这个的原因是在安装lotus notes的时候选择了 “使用本机的任何人( A)(多用户安装)”的原因。

2.dsapi开发资料

1)《利用 DSAPI 为 Domino Web 用户定制用户名和口令认证 》这篇是使用dsapi完成个性化认证的经典文章,是一篇入门级的文章,需要深读

2)要完成更深入的功能拓展,仅通过上面的文章里的内容是无法完成的,我们就需要下载dsapi的开发文档,借助api完成更深的内容,这个工具包可以在此下载:http://www.ibm.com/developerworks/develop/collaboration/index.html ,如下图,下载右边的IBM C and C++ API Toolkits for Notes and Domino 工具包:


3.dsapi研究内容

1)一个简单的dsapi dll的代码

dsapidemo.h

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <vector>

#include "dsapi/dsapi.h"
#ifdef SOLARIS
#include <shadow.h>
#endif

#ifdef AIX
#include <sys/types.h>
#include <pwd.h>
#endif

#ifdef HPUX
#include <pwd.h>
#include <crypt.h>
#include <unistd.h>
#endif

#include "dsapi/global.h"
#include "dsapi/osmem.h"
#include "dsapi/lookup.h"

STATUS FAR PASCAL MainEntryPoint (void);

unsigned int Authenticate(FilterContext* context, FilterAuthenticate* authData);

unsigned int FilterInit(FilterInitData* filterInitData);

unsigned int HttpFilterProc(FilterContext* context,unsigned int eventType, void* eventData);

dsapidemo.cpp

#include "stdafx.h"
#include "global.h"
#include "osmem.h"
#include "addin.h"
#include "dsapidemo.h"

STATUS FAR PASCAL MainEntryPoint(void)
{
	return NOERROR;
}

unsigned int FilterInit(FilterInitData* filterInitData)
{
	AddInLogMessageText("FilterInit start", NOERROR);
	filterInitData->appFilterVersion = kInterfaceVersion;
	filterInitData->eventFlags = kFilterAuthenticate;
	
	strcpy(filterInitData->filterDesc,
		"domino dsapi v1.0 Authentication Filter");
	return kFilterHandledEvent;
}

unsigned int TerminateFilter(unsigned int reserved)
{
	return kFilterHandledEvent;
}

unsigned int HttpFilterProc(FilterContext* context,
	unsigned int eventType, void* eventData)
{
	switch (eventType) {
	case kFilterAuthenticate:
		return Authenticate(context,
			(FilterAuthenticate *)eventData);
		break;
	default:
		break;
	}
	return kFilterNotHandled;
}
/*---
*	 自定义用户登录处理函数
*/
unsigned int Authenticate(FilterContext* context,
	FilterAuthenticate* authData)
{
	if (authData->userName==NULL || authData->password==NULL){
		AddInLogMessageText (string2, NOERROR);
		return kFilterNotHandled; 
	}
	else{
		if (strcmp((const char*)authData->userName,"super")==0 && strcmp((const char*)authData->password,"password" )==0)
		{  
			AddInLogMessageText ("super logged in successful", NOERROR);
			authData->authType = kAuthenticBasic;
			authData->foundInCache = TRUE;
			return kFilterHandledEvent;
		} 
	}

	return kFilterNotHandled;
}

2) 使用dsapi实现页面地址跳转

跳转函数如下,采用的是修改header头文件的方式实现页面跳转

http协议中规定 :

301 redirect: 301 代表永久性转移(Permanently Moved)
302 redirect: 302 代表暂时性转移(Temporarily Moved )

本函数中使用302,是应为301跳转成功一次后,浏览器记住了跳转地址,以后再访问同一网址则不过服务器之间跳转到原先跳转过的地址,与根据业务同一网址跳转到不同的页面的思路相矛盾。

unsigned int rewritePageUrl(FilterContext* context, FilterAuthenticate* authData,std::string rewriteUrl) {
	FilterResponseHeaders responseHeader;
	responseHeader.responseCode = 302;
	std::string logstr;
	unsigned int iRetCodeWriteClient;
	responseHeader.reasonText = "Moved temporary";
	std::string responseHeaderText = "Location:" + rewriteUrl + "\r\n\r\n\r\n";
	responseHeader.headerText = (char*)responseHeaderText.c_str();

	context->ServerSupport(context, ServerSupportTypes::kWriteResponseHeaders, &responseHeader, NULL, 0, &iRetCodeWriteClient);

	if (iRetCodeWriteClient == 0) {
		authData->authType = kAuthenticBasic;
		return	kFilterHandledRequest;
	}
	else {
		logstr = "rewrite client url error,errCode:" + iRetCodeWriteClient;
		AddInLogMessageText((char*)logstr.c_str(), NOERROR);
		return kFilterNotHandled;
	}
}


3)通过网址跳转自动创建登录session

在HttpFilterProc中返回kFilterHandledEvent仅表示用户事件已处理,在登录中表示已认证成功,但是其并不代表建立的session。Domino Web建立session是在names.nsf默认的登录页面登录成功之后建立起来的,如果想通过地址跳转模拟names.nsf登录,可以将rewriteUrl地址写成如下形式:

redirectUrl = serverPath+"/names.nsf?login&username="+username+"&Password="+password+"&redirectto="+url;

4)验证用户已登录

通过函数ServerSupport获取到的用户信息中,当domino session建立了则authentricateUser.pWebUserName不为空,否则这个值为空

unsigned int iRetCodeAuthUser = 0;
FilterAuthenticatedUser authentricateUser;
authentricateUser.fieldFlags = FilterAuthenticatedUserFields::kWebUserName;
context->ServerSupport(context, ServerSupportTypes::kGetAuthenticatedUserInfo, &authentricateUser, NULL, 0, &iRetCodeAuthUser);
if (authentricateUser.pWebUserName != NULL && authentricateUser.pWebUserName!="") {
	std::string cannonicalName(authentricateUser.pWebUserName);
	logstr = "autherized the webUserName=" + cannonicalName;
	AddInLogMessageText((char*)logstr.c_str(), NOERROR);
	return kFilterNotHandled;
}
else {
	logstr = "authentricateUser.pWebUserName = NULL";
	AddInLogMessageText((char*)logstr.c_str(), NOERROR);
	if ( casRemoteUserstr == "" && isOaResource==true) {
		std::string customRewriteUrl = "http://"+customHostname + url;
		return rewritePageUrl(context, authData, customRewriteUrl);
	}	
}


5)domino中使用dsapi

在domino admin中的配置-》服务器-》当前服务器文档-》Internet Protocol中修改选项DSAPI Filter file为自己编写的dll文件名称就行




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
DSAPI.DLL └─DSAPI ├─QQ用户相关 │ └─在线状态 │ ├─在线 │ ├─未知 │ └─离线 ├─内存资源 │ └─清理一下 ├─加载字体 │ └─加载指定字体文件 ├─图形图像 │ ├─从网址获取图片 │ ├─保护图像 │ │ ├─保护图像 │ │ └─解除保护 │ ├─图像特效 │ │ ├─变形 │ │ │ ├─从中心旋转 │ │ │ ├─从指定点旋转 │ │ │ └─调整大小 │ │ └─色彩 │ │ ├─亮度 │ │ ├─保留通道 │ │ ├─反色 │ │ ├─投影效果 │ │ ├─模糊 │ │ ├─灰度 │ │ ├─色彩通道 │ │ │ ├─粉 │ │ │ ├─红 │ │ │ ├─绿 │ │ │ ├─蓝 │ │ │ ├─青 │ │ │ └─黄 │ │ ├─透明度 │ │ └─黑与白 │ ├─彩色文字图像 │ │ ├─代码文本 │ │ ├─字体 │ │ ├─字符行距 │ │ ├─字符间距 │ │ ├─所有连接数量 │ │ ├─描边颜色 │ │ ├─文字清晰度 │ │ ├─文字颜色 │ │ ├─显示文本 │ │ ├─画布尺寸 │ │ ├─绘制描边 │ │ ├─绘制阴影 │ │ ├─获取指定坐标的链接 │ │ ├─输出图像 │ │ ├─链接 │ │ ├─链接下划线颜色 │ │ └─阴影颜色 │ └─透明窗体 │ ├─显示图像 │ ├─窗体支持鼠标拖动 │ ├─窗体支持鼠标调整尺寸 │ ├─绘制圆角矩形 │ └─绘制圆角矩形_带标题栏 ├─字串提取 │ ├─提取中间文本 │ └─提取所有中间文本 ├─序列化 │ ├─反序列化 │ ├─序列化 │ └─绑定 ├─文件类 │ ├─修改指定文件扩展名为指定打开方式 │ ├─压缩 │ ├─取消文件头 │ ├─添加文件头 │ ├─获取可读性强的字节大小信息 │ ├─解压缩 │ └─追加文件尾 ├─硬件信息 │ ├─硬件列表 │ ├─硬件选择 │ │ ├─主板 │ │ ├─光盘驱动器 │ │ ├─包括鼠标 │ │ ├─声卡 │ │ ├─打印机 │ │ ├─打印机任务 │ │ ├─指针设备 │ │ ├─显卡 │ │ ├─物理内存条 │ │ ├─硬盘序列号 │ │ ├─硬盘驱动器 │ │ ├─网络适配器 │ │ ├─软盘驱动器 │ │ └─键盘 │ └─获取硬件信息 ├─系统信息 │ ├─主显示器屏幕大小 │ ├─主显示器工作区大小 │ ├─使用交流电 │ │ ├─否 │ │ ├─是 │ │ └─未知 │ ├─启用列表框平滑滚动效果 │ ├─启用字体平滑效果 │ ├─启用平滑组合框打开效果 │ ├─启用按钮动画效果 │ ├─启用提示框淡入淡出效果 │ ├─启用标题栏渐变效果 │ ├─启用桌面主题 │ ├─启用窗口还原动画效果 │ ├─启用窗口阴影效果 │ ├─启用自动对齐默认按钮 │ ├─启用菜单淡入淡出效果 │ ├─图标排列单元格高度 │ ├─图标排列格子大小 │ ├─子菜单延迟显示时间 │ ├─屏幕旋转角度 │ ├─工作组 │ ├─已连接交

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风水月

从心底相信自己是成功的第一步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值