基于MXRT的CGI开发,简化,集成
根据配置文件初始化多个服务器
1. LDAP,实现用户登陆信息的统一
2. 数据库(现已实现PostgreSQL、SQLite、OracleEX的适配)
采用XML/XSLT实现多种终端的适配,至少现在已在实现B/S模式,同时支持简单的C/S模式和手机客户端(分别是MUIP_WS和MUIP_WS_mobile)
MUIP_WS基于wxWidgets开发,同时支持Windows和Linux系统,同时在Linux系统上采用了动态库导入技术,避免了*nix环境的DLL地狱
习惯了C++开发,并不会比PHP复杂
个人的体会:一切的复杂来自于基础库的缺失
以下的代码来自于的登陆模块
// Author: zhufei
// Mail: zhufei@wawton.com
// MSN: zhufei@wawton.com
#include "muip/session.h"
#include "muip/ldap.h"
#include "openssl/aes.h"
#include "mxrt/base64.h"
#include "mxrt/xml_doc.h"
#include "mxrt/xml_node.h"
#include "mxrt/dbtool.h"
int32_t ShowSSOLoginPage();
int main( int argc, char* argv[] )
{
int32_t nRet = MXRT_SUCCESS;
for ( int32_t iOnce = 0; iOnce < 1; ++ iOnce )
{
// 初始化Session
nRet = MUIPSession::Instance()->Init( "conf/muip.conf.xml", true );
if ( nRet != MXRT_SUCCESS )
{
MUIP::ErrorDebug( "sso_login", nRet, "config file error", "Home", "/cgi-bin/index.cgi" );
break;
}
// 检查Cookie,并依此进行用户状态判断
if ( ! MUIPSession::Instance()->IsLogon() ) // 没有登陆
{
// 获取用户名/密码数据,如果没有,显示登陆页面
//TODO
//ShowSSOLoginPage();
// 采用LDAP进行用户认证
MUIPLdap::UserInfo userInfo;
nRet = MUIPLdap::AuthUser( strUsername, strPassword, userInfo );
if ( nRet != MXRT_SUCCESS )
{
MUIP::ErrorDebug( "sso_login", nRet, "invalid username or password", "login page", "/cgi-bin/sso_login.cgi" );
break;
}
// 创建Session数据
//TODO
// 从数据库获取用户数据
std::string strUserRank;
char bufStmt[MXRT_DFT_BUF_SIZE];
int lenStmt = 0;
MRecordSet recordSet;
lenStmt = ::snprintf( bufStmt, sizeof(bufStmt),
"SELECT usr_rank FROM tbl_usr WHERE usr_id=%lld",
userInfo.llnUID
);
MDBTool::Instance()->Query( bufStmt, lenStmt, &recordSet );
if ( recordSet.GetRows() > 0 )
{
strUserRank.assign( recordSet.GetData(0,0) );
}
else
{
strUserRank.assign( MCommon::Itoa(MUIP_USER_RANK_GUEST) );
}
// 设置Session数据
//TODO
MCGI::Instance()->OutputCookies();
MUIP::RedirectTo( "/cgi-bin/index.cgi" );
}
nRet = MXRT_SUCCESS;
}
MUIPSession::Destroy();
return nRet;
}
int ShowSSOLoginPage()
{
//显示用户登陆页面
return MXRT_SUCCESS;
}
阅读(7998) | 评论(0) | 转发(0) |