基于XML的简单用户管理
2008-10-10 11:12
253 查看
在ASP.NET中,通常都使用数据库如SQL Server或Access来实现用户管理。对于简单的小站点来说,通常不需要这么复杂。本文使用XML来实现简单的用户管理功能。
首先来考虑我们的用户信息。
用户信息应该包括以下内容:
1。用户名称
2。密码,为了保证安全性,应该对密码进行简单加密,这里使用了MD5算法生成的摘要来保存密码
3。有效性
4。权限,这里仅简单的设计了一种权限即管理权限
有了这些信息,我们的XML文件(User.xml)应该如下所示:
<?xml version="1.0" encoding="utf-8"?>
<UserInfo>
<UserInfoNode name="admin" password="e10adc3949ba59abbe56e057f20f883e" available="1" isAdmin="1" />
<UserInfoNode name="igame" password="c33367701511b4f6020ec61ded352059" available="1" isAdmin="0" />
</UserInfo>
解释如下:
UserInfoNode节点的属性:
name:用户名
password:根据密码生成的MD5串
available:账号有效标志,1:有效,0:无效
isAdmin:管理权限标志,1:有权限,0:无权限
有了基本的用户账号数据库,可以着手进行实现了。
下面是账户管理类Account的实现:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml; // 偶们要使用XML
using System.Collections.Generic; // 偶们要使用List
namespace igame // 命名空间,igame当然使用igame
{
/// <summary>
/// Summary description for Account 偷懒,不写
/// </summary>
public class Account // 账号管理类
{
public struct UserInfoStruc // 用户信息的结构定义,注意:不包括密码域
{
public string userName; // 账号名称
public bool available; // 有效标志
public bool isAdmin; // 管理权限标志
}; // UserInfoStruc
private XmlDocument _xmlDoc = new XmlDocument(); // 生成XmlDocument对象,偶们以后的操作都针对它!
private string _filePath = string.Empty; // Xml账号文件的路径
public Account(string filepath) // 构造方法
{
//
// TODO: Add constructor logic here
//
if (System.IO.File.Exists(filepath)) // 检测XML文件存在性
{
_xmlDoc.Load(filepath); // 装载
_filePath = filepath; // 保存文件路径,更新了账号信息后,要保存滴!
}
} // Account
/// <summary>
/// 获取所有账号的列表
/// </summary>
/// <returns>UserInfoStruc[]</returns>
public UserInfoStruc[] getUserInfoList()
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes; // 所有节点,对应于<UserInfoNode ...></UserInfoNode>
XmlNode node = null; // 当前节点
List<UserInfoStruc> res = new List<UserInfoStruc>(); // 返回值
for (int i = 0; i < nodelist.Count; i++) // 遍历
{
node = nodelist.Item(i); // 获取节点
// 获取账号信息,并填充到返回列表
UserInfoStruc uis = new UserInfoStruc();
uis.userName = node.Attributes["name"].Value.ToLower(); // 账号名
uis.available = node.Attributes["available"].Value == "1"; // 有效标志
uis.isAdmin = node.Attributes["isAdmin"].Value == "1"; // 管理权限
res.Add(uis);
}
return res.ToArray(); // 返回
} // getUserInfoList
/// <summary>
/// 内部使用,获取指定账号的所有信息,当然包括密码
/// </summary>
/// <param name="username"></param>
/// <param name="pwd">引用,密码</param>
/// <param name="available">引用,有效标志</param>
/// <param name="isAdmin">引用,管理权限</param>
/// <returns>成功或失败</returns>
private bool getUserInfo(string username, ref string pwd, ref bool available, ref bool isAdmin)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes; // 账号信息节点列表
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 逐个比较
{
pwd = node.Attributes["password"].Value.ToLower();
available = node.Attributes["available"].Value == "1";
isAdmin = node.Attributes["isAdmin"].Value == "1";
return true; // 成功找到
}
}
return false; // 可耻滴失败鸟!
} // getUserInfo
/// <summary>
/// 对指定的账号密码进行验证
/// </summary>
/// <param name="username">账号名称</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
public bool authenticate(string username, string pwd)
{
string md5Str = string.Empty;
bool available = false;
bool isAdmin = false;
if (getUserInfo(username, ref md5Str, ref available, ref isAdmin)) // 获取账号信息
{
return available && md5Str == CalcMD5.GetMD5(pwd).ToLower(); // 账号有效且MD5串契合则成功
}
return false; // 验证失败鸟!
}// authenticate
/// <summary>
/// 检测指定的账号是否存在
/// </summary>
/// <param name="username">账号名称</param>
/// <returns>存在与否</returns>
public bool userExists(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 比较账号名称,相等则成功
{
return true;
}
}
return false; // 还是失败!
} // userExists
/// <summary>
/// 内部使用,创建新的XML节点属性对象
/// </summary>
/// <param name="name">属性名称</param>
/// <param name="value">属性值</param>
/// <returns>节点属性XmlAttribute对象</returns>
private XmlAttribute createNewAttr(string name, string value)
{
XmlAttribute attr = (XmlAttribute)_xmlDoc.CreateNode(XmlNodeType.Attribute, name, string.Empty);
attr.Value = value;
return attr;
} // createNewAttr
/// <summary>
/// 根据指定信息添加新账号,如果指定的账号存在,则更新之
/// </summary>
/// <param name="username">账号名称</param>
/// <param name="pwd">密码</param>
/// <param name="available">有效标志</param>
/// <param name="_isadmin">管理权限</param>
/// <returns>成功或失败</returns>
public bool addUser(string username, string pwd, bool available, bool _isadmin)
{
if (!userExists(username)) // 用户不存在?
{
// 创建账号节点
XmlNode node = _xmlDoc.CreateNode(XmlNodeType.Element, "UserInfoNode", string.Empty);
// 生成账号信息
node.Attributes.Append(createNewAttr("name", username));
node.Attributes.Append(createNewAttr("password", CalcMD5.GetMD5(pwd.ToLower()))); // 根据密码字符串生成MD5串
node.Attributes.Append(createNewAttr("available", available ? "1" : "0"));
node.Attributes.Append(createNewAttr("isAdmin", _isadmin ? "1" : "0"));
_xmlDoc.DocumentElement.AppendChild(node); // 添加
_xmlDoc.Save(_filePath); // 保存
return true;
}
else
return updUser(username, pwd, available, _isadmin); // 存在则更新之
} // addUser
/// <summary>
/// 更新指定账号的信息
/// </summary>
/// <param name="username">账号名称</param>
/// <param name="pwd">密码</param>
/// <param name="available">有效标志</param>
/// <param name="_isadmin">管理权限</param>
/// <returns>成功或失败</returns>
public bool updUser(string username, string pwd, bool available, bool _isadmin)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 账号存在?
{
if (pwd != null && pwd.Length > 0) // 密码必须有效,否则无法登录哦!
node.Attributes["password"].Value = CalcMD5.GetMD5(pwd).ToLower();
node.Attributes["available"].Value = available ? "1" : "0";
node.Attributes["isAdmin"].Value = _isadmin ? "1" : "0";
_xmlDoc.Save(_filePath); // 别忘了保存
return true; // 成功返回
}
}
return false; // 失败
} // updUser
/// <summary>
/// 更新指定账号的密码
/// </summary>
/// <param name="username">账户名称</param>
/// <param name="pwd">密码</param>
/// <returns>成功或失败</returns>
public bool updPwd(string username, string pwd)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower())
{
if (pwd != null && pwd.Length > 0) // 仅当密码有效时进行更新
{
node.Attributes["password"].Value = CalcMD5.GetMD5(pwd).ToLower();
_xmlDoc.Save(_filePath);
return true;
}
else
break;
}
}
return false;
} // updPwd
/// <summary>
/// 删除指定的账户
/// </summary>
/// <param name="username">指定的账户名称</param>
/// <returns></returns>
public bool removeUser(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 账户契合?
{
_xmlDoc.DocumentElement.RemoveChild(node); // 删除之
_xmlDoc.Save(_filePath); // 保存更新
return true;
}
}
return false;
} // removeUser
/// <summary>
/// 检验指定账户的管理权限
/// </summary>
/// <param name="username">账户名称</param>
/// <returns>成功或失败</returns>
public bool isAdmin(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower())
{
return node.Attributes["isAdmin"].Value == "1"; // 必须等于1
}
}
return false;
} // isAdmin
/// <summary>
/// 检验指定的账户是否有效
/// </summary>
/// <param name="username">指定的账户名称</param>
/// <returns>有效与否</returns>
public bool isAvailable(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower())
{
return node.Attributes["available"].Value == "1"; // 必须等于1
}
}
return false;
} // isAvailable
} // class Account
} // namespace igame
下面是关于MD5计算的实现:
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace igame
{
public class CalcMD5
{
public static string GetMD5(string s)
{
/// <summary>
/// 与ASP兼容的MD5加密算法
/// </summary>
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(s));
StringBuilder sb = new StringBuilder(32);
for (int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString("x").PadLeft(2, '0'));
}
return sb.ToString();
}
}
}
OK,完成鸟。
此乃末技。。。。。
首先来考虑我们的用户信息。
用户信息应该包括以下内容:
1。用户名称
2。密码,为了保证安全性,应该对密码进行简单加密,这里使用了MD5算法生成的摘要来保存密码
3。有效性
4。权限,这里仅简单的设计了一种权限即管理权限
有了这些信息,我们的XML文件(User.xml)应该如下所示:
<?xml version="1.0" encoding="utf-8"?>
<UserInfo>
<UserInfoNode name="admin" password="e10adc3949ba59abbe56e057f20f883e" available="1" isAdmin="1" />
<UserInfoNode name="igame" password="c33367701511b4f6020ec61ded352059" available="1" isAdmin="0" />
</UserInfo>
解释如下:
UserInfoNode节点的属性:
name:用户名
password:根据密码生成的MD5串
available:账号有效标志,1:有效,0:无效
isAdmin:管理权限标志,1:有权限,0:无权限
有了基本的用户账号数据库,可以着手进行实现了。
下面是账户管理类Account的实现:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml; // 偶们要使用XML
using System.Collections.Generic; // 偶们要使用List
namespace igame // 命名空间,igame当然使用igame
{
/// <summary>
/// Summary description for Account 偷懒,不写
/// </summary>
public class Account // 账号管理类
{
public struct UserInfoStruc // 用户信息的结构定义,注意:不包括密码域
{
public string userName; // 账号名称
public bool available; // 有效标志
public bool isAdmin; // 管理权限标志
}; // UserInfoStruc
private XmlDocument _xmlDoc = new XmlDocument(); // 生成XmlDocument对象,偶们以后的操作都针对它!
private string _filePath = string.Empty; // Xml账号文件的路径
public Account(string filepath) // 构造方法
{
//
// TODO: Add constructor logic here
//
if (System.IO.File.Exists(filepath)) // 检测XML文件存在性
{
_xmlDoc.Load(filepath); // 装载
_filePath = filepath; // 保存文件路径,更新了账号信息后,要保存滴!
}
} // Account
/// <summary>
/// 获取所有账号的列表
/// </summary>
/// <returns>UserInfoStruc[]</returns>
public UserInfoStruc[] getUserInfoList()
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes; // 所有节点,对应于<UserInfoNode ...></UserInfoNode>
XmlNode node = null; // 当前节点
List<UserInfoStruc> res = new List<UserInfoStruc>(); // 返回值
for (int i = 0; i < nodelist.Count; i++) // 遍历
{
node = nodelist.Item(i); // 获取节点
// 获取账号信息,并填充到返回列表
UserInfoStruc uis = new UserInfoStruc();
uis.userName = node.Attributes["name"].Value.ToLower(); // 账号名
uis.available = node.Attributes["available"].Value == "1"; // 有效标志
uis.isAdmin = node.Attributes["isAdmin"].Value == "1"; // 管理权限
res.Add(uis);
}
return res.ToArray(); // 返回
} // getUserInfoList
/// <summary>
/// 内部使用,获取指定账号的所有信息,当然包括密码
/// </summary>
/// <param name="username"></param>
/// <param name="pwd">引用,密码</param>
/// <param name="available">引用,有效标志</param>
/// <param name="isAdmin">引用,管理权限</param>
/// <returns>成功或失败</returns>
private bool getUserInfo(string username, ref string pwd, ref bool available, ref bool isAdmin)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes; // 账号信息节点列表
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 逐个比较
{
pwd = node.Attributes["password"].Value.ToLower();
available = node.Attributes["available"].Value == "1";
isAdmin = node.Attributes["isAdmin"].Value == "1";
return true; // 成功找到
}
}
return false; // 可耻滴失败鸟!
} // getUserInfo
/// <summary>
/// 对指定的账号密码进行验证
/// </summary>
/// <param name="username">账号名称</param>
/// <param name="pwd">密码</param>
/// <returns></returns>
public bool authenticate(string username, string pwd)
{
string md5Str = string.Empty;
bool available = false;
bool isAdmin = false;
if (getUserInfo(username, ref md5Str, ref available, ref isAdmin)) // 获取账号信息
{
return available && md5Str == CalcMD5.GetMD5(pwd).ToLower(); // 账号有效且MD5串契合则成功
}
return false; // 验证失败鸟!
}// authenticate
/// <summary>
/// 检测指定的账号是否存在
/// </summary>
/// <param name="username">账号名称</param>
/// <returns>存在与否</returns>
public bool userExists(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 比较账号名称,相等则成功
{
return true;
}
}
return false; // 还是失败!
} // userExists
/// <summary>
/// 内部使用,创建新的XML节点属性对象
/// </summary>
/// <param name="name">属性名称</param>
/// <param name="value">属性值</param>
/// <returns>节点属性XmlAttribute对象</returns>
private XmlAttribute createNewAttr(string name, string value)
{
XmlAttribute attr = (XmlAttribute)_xmlDoc.CreateNode(XmlNodeType.Attribute, name, string.Empty);
attr.Value = value;
return attr;
} // createNewAttr
/// <summary>
/// 根据指定信息添加新账号,如果指定的账号存在,则更新之
/// </summary>
/// <param name="username">账号名称</param>
/// <param name="pwd">密码</param>
/// <param name="available">有效标志</param>
/// <param name="_isadmin">管理权限</param>
/// <returns>成功或失败</returns>
public bool addUser(string username, string pwd, bool available, bool _isadmin)
{
if (!userExists(username)) // 用户不存在?
{
// 创建账号节点
XmlNode node = _xmlDoc.CreateNode(XmlNodeType.Element, "UserInfoNode", string.Empty);
// 生成账号信息
node.Attributes.Append(createNewAttr("name", username));
node.Attributes.Append(createNewAttr("password", CalcMD5.GetMD5(pwd.ToLower()))); // 根据密码字符串生成MD5串
node.Attributes.Append(createNewAttr("available", available ? "1" : "0"));
node.Attributes.Append(createNewAttr("isAdmin", _isadmin ? "1" : "0"));
_xmlDoc.DocumentElement.AppendChild(node); // 添加
_xmlDoc.Save(_filePath); // 保存
return true;
}
else
return updUser(username, pwd, available, _isadmin); // 存在则更新之
} // addUser
/// <summary>
/// 更新指定账号的信息
/// </summary>
/// <param name="username">账号名称</param>
/// <param name="pwd">密码</param>
/// <param name="available">有效标志</param>
/// <param name="_isadmin">管理权限</param>
/// <returns>成功或失败</returns>
public bool updUser(string username, string pwd, bool available, bool _isadmin)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 账号存在?
{
if (pwd != null && pwd.Length > 0) // 密码必须有效,否则无法登录哦!
node.Attributes["password"].Value = CalcMD5.GetMD5(pwd).ToLower();
node.Attributes["available"].Value = available ? "1" : "0";
node.Attributes["isAdmin"].Value = _isadmin ? "1" : "0";
_xmlDoc.Save(_filePath); // 别忘了保存
return true; // 成功返回
}
}
return false; // 失败
} // updUser
/// <summary>
/// 更新指定账号的密码
/// </summary>
/// <param name="username">账户名称</param>
/// <param name="pwd">密码</param>
/// <returns>成功或失败</returns>
public bool updPwd(string username, string pwd)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower())
{
if (pwd != null && pwd.Length > 0) // 仅当密码有效时进行更新
{
node.Attributes["password"].Value = CalcMD5.GetMD5(pwd).ToLower();
_xmlDoc.Save(_filePath);
return true;
}
else
break;
}
}
return false;
} // updPwd
/// <summary>
/// 删除指定的账户
/// </summary>
/// <param name="username">指定的账户名称</param>
/// <returns></returns>
public bool removeUser(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower()) // 账户契合?
{
_xmlDoc.DocumentElement.RemoveChild(node); // 删除之
_xmlDoc.Save(_filePath); // 保存更新
return true;
}
}
return false;
} // removeUser
/// <summary>
/// 检验指定账户的管理权限
/// </summary>
/// <param name="username">账户名称</param>
/// <returns>成功或失败</returns>
public bool isAdmin(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower())
{
return node.Attributes["isAdmin"].Value == "1"; // 必须等于1
}
}
return false;
} // isAdmin
/// <summary>
/// 检验指定的账户是否有效
/// </summary>
/// <param name="username">指定的账户名称</param>
/// <returns>有效与否</returns>
public bool isAvailable(string username)
{
XmlNodeList nodelist = _xmlDoc.DocumentElement.ChildNodes;
XmlNode node = null;
for (int i = 0; i < nodelist.Count; i++)
{
node = nodelist.Item(i);
if (node.Attributes["name"].Value.ToLower() == username.ToLower())
{
return node.Attributes["available"].Value == "1"; // 必须等于1
}
}
return false;
} // isAvailable
} // class Account
} // namespace igame
下面是关于MD5计算的实现:
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace igame
{
public class CalcMD5
{
public static string GetMD5(string s)
{
/// <summary>
/// 与ASP兼容的MD5加密算法
/// </summary>
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.GetEncoding("gb2312").GetBytes(s));
StringBuilder sb = new StringBuilder(32);
for (int i = 0; i < t.Length; i++)
{
sb.Append(t[i].ToString("x").PadLeft(2, '0'));
}
return sb.ToString();
}
}
}
OK,完成鸟。
此乃末技。。。。。
相关文章推荐
- 基于spring3.0.5 mvc 简单用户管理实例
- 基于spring3.0.5 mvc 简单用户管理实例
- 简单管理系统的开发流程(基于XML)
- 完全基于Servlet的简单用户管理系统
- 基于bootstrap实现简单用户管理功能
- 基于spring3.0.5 mvc 简单用户管理实例
- 2015.03.10 简单文件管理与用户管理
- 【转】基于 (react+dva+antd)完成用户管理的 CURD 应用,升级版antd-admin
- mahout基于用户推荐的简单例子(2)
- 简单的用户权限管理
- webservice24--基于契约优先开发用户管理小功能--实现wsdl
- springboot 简单用户管理模块
- 基于SQLite的安卓平台用户信息管理系统
- 基于用户行为的数据分析与挖掘+分布式日志管理系统
- applicationContext.xml配置文件在用户管理中的使用
- 基于LitePal操作数据库的学生管理系统的简单实现
- 基于jsp,servlet的简单图书馆管理软件
- ExtJS & GTGrid 简单用户管理
- 基于EasyNVR二次开发实现业务需求:用户、权限、设备管理
- Linux——用户管理简单学习笔记(一)