企业数据库管理应用系统实现多种登录方式(策略模式)
应用软件系统内部集成授权登录功能 (Login Window)
任何基于数据库管理应用软件都集成系统登录功能,通常的作法是在登录窗体输入用户名和密码,然后调用业务层的安全管理模块检查用户名和密码,检查通过则允许进入系统程序主界面。
然而,有些企业为了响应用户避免使用系统前必须登录及强制输入用户名及密码,认为这样操作很麻烦,理由是用户在登入Windows操作系统时已经输入域用户和密码了,或者输入了Novell网用户及密码,为了避免再次授权登录用户要求软件集成自动登录功能。
此需求相信大多数人为之不解且纳闷着,理论上操作系统授权和应用系统授权是完全独立的不能一概而论,但是这些生产企业的管理系统不得不考虑集成自动登录方便用户使用,提高生产效率法则至高无上。企业定制软件和市场产品不同,定制软件就是定制特色。
集成域用户和Novell网用户自动登录解决方案
为了兼容自动登录功能涉及修改的地方很多,主要是权限管理相关数据结构,比如用户资料,用户组,角色等,在这里不系统性的讨论了。
在用户表tb_MyUser增加两个字段:
NovellAccount varchar(250)
DomainAccount varchar(250)
NovellAccount:
存储用户对应的Novell用户名,多个用户名用逗号分开。
如:UserA.ABC.COM, UserA.ABC.CN, UserA.ABC.HK
如中国大陆的域为ABC.CN, UserA的用户全名是UserA.ABC.CN,
香港的域为ABC.HK,UserA的用户全名是UserA.ABC.HK等等。
问题:
为什么有多个用户名呢?
因为企业网络是通过VPN技术组建的,按组织结构组建了分布在不同区域的局域网,管理人员或开发实施部门的用户都需要在这些网络内建立用户名。主要是考虑到行政管理及VPN网速不适合跨区域快速存取数据等,这样,一个用户需要在多个网域建立帐号了。
DomainAccount:
记录用户对应的域用户名,多个用户名用逗号分开。
如:UserA@ABC.COM, UserA@ABC.CN, UserA@ABC.HK
这两个字段与Account字段建立了对应关系, tb_MyUser表结构:
---------------------------------------------------------------------------
Account | NovellAccount | DomainAccount
---------------------------------------------------------------------------
UserA | UserA.ABC.COM, UserA.ABC.CN | UserA@ABC.COM, UserA@ABC.CN
.......
通过这个表即可实现Domain与Novell网用户自动登录。
1. 登录前从本地取到当前登录的Novell用户名, 如:UserA.ABC.CN,与NovellAccount字段匹配是否存在。
2. 登录前从本地取到Domain用户名,如:UserA@ABC.CN,与DomainAccount字段匹配是否存在。
本人的电脑已连接Windows域及Novell网, 在实际环境内调试成功,为了考虑没有加入域和Novell网络环境的朋友,在源码内屏蔽了相关API函数。
/// <summary>
/// 登录授权模式
/// </summary>
public interface ILoginAuthorization
{
/// <summary>
/// 登录,验证用户.
/// </summary>
bool Login();
/// <summary>
/// 当前登录策略是否支持登出模式
/// </summary>
bool SupportLogout { get; }
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
/// <summary>
/// 支持登录用户类型
/// </summary>
public enum LoginUserType
{
/// <summary>
/// 系统内部用户
/// </summary>
S, //System Account
/// <summary>
/// Windows域用户
/// </summary>
W, //Windows Domain Account
/// <summary>
/// Novell用户
/// </summary>
N //Novell Account
}
private void btnLogin_Click(object sender, EventArgs e)
{
try
{
this.Cursor = Cursors.WaitCursor;
this.SetButtonEnable(false);
this.Update();//必须
this.ShowLoginInfo("正在验证用户名及密码");
if (_CurrentAuthorization.Login()) //调用登录策略
{
SystemAuthorization.Current = _CurrentAuthorization; //登录成功, 保存当前授权模式
Msg.ShowInformation("登录成功!\r\n\r\n用户:" txtUser.Text "\r\n策略:"
_CurrentAuthorization.ToString() "\r\n\r\n\r\n开始打开主窗体 frmMain ....");
this.DialogResult = DialogResult.OK; //成功
this.Close(); //关闭登陆窗体
}
else
{
throw new Exception("登录失败,请检查用户名和密码!");
}
}
catch (Exception ex)
{
this.SetButtonEnable(true);
this.ShowLoginInfo(ex.Message);
Msg.Warning(ex.Message);
}
this.Cursor = Cursors.Default;
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
.\debug\NovellLdapImp.dll文件,用Delphi封装的Novell LDAP API库。
.\debug\cfg.ini文件, 在第一行指定S,W,N,指定登录策略
N
//S:SYSTEM
//W:DOMAIN
//N:NOVELL
.\Debug\DB\CSFrameworkTestDB.mdf数据库文件
请修改dalUser.cs , 配置连接字符串
private SqlConnection CreateConnection()
{
string db = @"E:\CSFramework.Tech\LoginStrategy\Debug\DB\CSFrameworkTestDB.mdf";
string conn = @"Server=.\SQLEXPRESS;AttachDbFileName="+db+";Integrated Security=True;";
return new SqlConnection(conn);
}
Source Code for VIP: