C 實現基於角色的權限系統

執行完畢後 修改下 app.config中的數據庫連接串 為你本機的即可

【實例截圖】

下面為管理員登陸後的效果

管理員賬號:admin

密碼:666666

下面為普通用戶登陸後的效果:

普通用戶名:user 密碼 111111

【核心代碼】

<table><tbody>
<code>/// <summary>/<code>
<code> /<code><code>/// 根據操作員名稱和密碼獲取操作員實體/<code>
<code> /<code><code>/// /<code>
<code> /<code><code>/// <param>操作員名稱/<code>
<code> /<code><code>/// <param>操作員密碼/<code>
<code> /<code><code>/// <returns>操作員實體/<returns>/<code>
<code> /<code><code>public/<code> <code>Model.Operator GetOperatorInfoByName(string name, string pwd)/<code>
<code> /<code><code>{/<code>
<code> /<code><code>//SQL命令/<code>
<code> /<code><code>string sqltxt = string.Format(/<code><code>"Select Id, OperatorName, Password, RightsList, State From Operator Where OperatorName = '{0}' And Password = '{1}'"/<code><code>, name, pwd);/<code>
<code> /<code><code>//創建操作員實體/<code>
<code> /<code><code>Model.Operator tmpOperator = /<code><code>new/<code> <code>Model.Operator();/<code>
<code> /<code><code>// 轉換數據庫存儲的 二進制數據為 Byte[] 數組 以便進而轉換為操作員權限集合/<code>
<code> /<code><code>// 從配置文件讀取連接字符串/<code>
<code> /<code><code>string connectionString = ConfigurationManager.ConnectionStrings[/<code><code>"SQLSERVER"/<code><code>].ConnectionString;/<code>
<code> /<code><code>// 執行 SQL 命令/<code>
<code> /<code><code>using (SqlConnection conn = /<code><code>new/<code> <code>SqlConnection(connectionString))/<code>
<code> /<code><code>{/<code>
<code> /<code><code>SqlCommand cmd = /<code><code>new/<code> <code>SqlCommand(sqltxt, conn);/<code>
<code> /<code><code>conn.Open();/<code>
<code> /<code><code>using (SqlDataReader myReader = cmd.ExecuteReader(/<code>
<code> /<code><code>CommandBehavior.CloseConnection | /<code>
<code> /<code><code>CommandBehavior.SingleResult | /<code>
<code> /<code><code>CommandBehavior.SingleRow))/<code>
<code> /<code><code>{/<code>
<code> /<code><code>if/<code> <code>(myReader.Read())/<code>
<code> /<code><code>{/<code>
<code> /<code><code>//將數據集轉換成實體集合/<code>
<code> /<code><code>tmpOperator.Id = Convert.ToInt32(myReader[/<code><code>"Id"/<code><code>]);/<code>
<code> /<code><code>tmpOperator.ModelName = Convert.ToString(myReader[/<code><code>"OperatorName"/<code><code>]);/<code>
<code> /<code><code>tmpOperator.Password = Convert.ToString(myReader[/<code><code>"Password"/<code><code>]);/<code>
<code> /<code><code>tmpOperator.State = Convert.ToBoolean(myReader[/<code><code>"State"/<code><code>]);/<code>
<code> /<code><code>// 讀取權限集合/<code>
<code> /<code><code>System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes(/<code><code>3/<code><code>); /<code><code>// 只能指定列序號/<code>
<code> /<code><code>// 將流反序列化為權限集合對象/<code>
<code> /<code><code>BinaryFormatter bf = /<code><code>new/<code> <code>BinaryFormatter();/<code>
<code> /<code><code>if/<code> <code>(!bytes.IsNull)/<code>
<code> /<code><code>tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string>);/<string>/<code>
<code> /<code><code>//else/<code>
<code> /<code><code>// throw new Exception(string.Format("操作員 [{0}] 沒有任何權限,禁止登錄!", tmpOperator.ModelName));/<code>
<code> /<code><code>}/<code>
<code> /<code><code>else/<code>
<code> /<code><code>//如果沒有讀取到內容則拋出異常/<code>
<code> /<code><code>throw/<code> <code>new/<code> <code>Exception(/<code><code>"登錄名稱或用戶密碼不正確!"/<code><code>);/<code>
<code> /<code><code>}/<code>
<code> /<code><code>}/<code>
<code> /<code><code>// 如果操作員已經被禁用/<code>
<code> /<code><code>if/<code> <code>(!tmpOperator.State)/<code>
<code> /<code><code>throw/<code> <code>new/<code> <code>Exception(string.Format(/<code><code>"操作員 [{0}] 已被禁用,請與管理員聯繫!"/<code><code>, tmpOperator.ModelName));/<code>
<code> /<code><code>// 返回結果/<code>
<code> /<code><code>return/<code> <code>tmpOperator;/<code>
<code> /<code><code>}/<code>
<code> /<code><code>/// <summary>/<code>
<code> /<code><code>/// 添加操作員/<code>
<code> /<code><code>/// /<code>
<code> /<code><code>/// <param>要添加的操作員實體/<code>
<code> /<code><code>/// <returns>True:成功/False:失敗/<returns>/<code>
<code> /<code><code>public/<code> <code>bool AddOperator(Model.Operator addOperator)/<code>
<code> /<code><code>{/<code>
<code> /<code><code>// 驗證密碼長度/<code>
<code> /<code><code>if/<code> <code>(addOperator.Password.Trim().Length < /<code><code>6/<code><code>)/<code>
<code> /<code><code>throw/<code> <code>new/<code> <code>Exception(/<code><code>"用戶密碼長度不能小於六位!"/<code><code>);/<code>
<code> /<code><code>// 轉換操作員權限集合為數據庫可存取的 Byte[] 數組/<code>
<code> /<code><code>MemoryStream ms = /<code><code>new/<code> <code>MemoryStream();/<code>
<code> /<code><code>BinaryFormatter bf = /<code><code>new/<code> <code>BinaryFormatter();/<code>
<code> /<code><code>bf.Serialize(ms, addOperator.RightsCollection);/<code>
<code> /<code><code>byte/<code><code>[] rigthsByteArray = /<code><code>new/<code> <code>byte/<code><code>[(/<code><code>int/<code><code>)(ms.Length)];/<code>
<code> /<code><code>ms.Position = /<code><code>0/<code><code>;/<code>
<code> /<code><code>ms.Read(rigthsByteArray, /<code><code>0/<code><code>, (/<code><code>int/<code><code>)(ms.Length));/<code>
<code> /<code><code>ms.Close();/<code>
<code> /<code><code>// 拼接 SQL 命令/<code>
<code> /<code><code>string sqlTxt = /<code><code>"Insert Into Operator (OperatorName, Password, RightsList, State) Values "/<code>
<code> /<code><code>"(@OperatorName, @Password, @RightsList, @State)"/<code><code>;/<code>
<code> /<code><code>// 從配置文件讀取連接字符串/<code>
<code> /<code><code>string connectionString = ConfigurationManager.ConnectionStrings[/<code><code>"SQLSERVER"/<code><code>].ConnectionString;/<code>
<code> /<code><code>// 執行 SQL 命令/<code>
<code> /<code><code>using (SqlConnection conn = /<code><code>new/<code> <code>SqlConnection(connectionString))/<code>
<code> /<code><code>{/<code>
<code> /<code><code>SqlCommand cmd = /<code><code>new/<code> <code>SqlCommand(sqlTxt, conn);/<code>
<code> /<code><code>SqlParameter prm1 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@OperatorName"/<code><code>, SqlDbType.NVarChar, /<code><code>50/<code><code>);/<code>
<code> /<code><code>prm1.Value = addOperator.ModelName;/<code>
<code> /<code><code>SqlParameter prm2 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@Password"/<code><code>, SqlDbType.NVarChar, /<code><code>50/<code><code>);/<code>
<code> /<code><code>prm2.Value = addOperator.Password;/<code>
<code> /<code><code>SqlParameter prm3 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@RightsList"/<code><code>, SqlDbType.VarBinary, rigthsByteArray.Length,/<code>
<code> /<code><code>ParameterDirection.Input, /<code><code>false/<code><code>, /<code><code>0/<code><code>, /<code><code>0/<code><code>, /<code><code>null/<code><code>, DataRowVersion.Current, rigthsByteArray);/<code>
<code> /<code><code>SqlParameter prm4 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@State"/<code><code>, SqlDbType.Bit);/<code>
<code> /<code><code>prm4.Value = addOperator.State;/<code>
<code> /<code><code>cmd.Parameters.AddRange(/<code><code>new/<code> <code>SqlParameter[] { prm1, prm2, prm3, prm4 });/<code>
<code> /<code><code>conn.Open();/<code>
<code> /<code><code>if/<code> <code>(cmd.ExecuteNonQuery() >= /<code><code>1/<code><code>)/<code>
<code> /<code><code>return/<code> <code>true/<code><code>;/<code>
<code> /<code><code>else/<code>
<code> /<code><code>return/<code> <code>false/<code><code>;/<code>
<code> /<code><code>}/<code>
<code> /<code><code>}/<code>
<code> /<code><code>/// <summary>/<code>
<code> /<code><code>/// 刪除操作員/<code>
<code> /<code><code>/// /<code>
<code> /<code><code>/// <param>要刪除的操作員 ID/<code>
<code> /<code><code>/// <returns>True:成功/False:失敗/<returns>/<code>
<code> /<code><code>public/<code> <code>bool DeleteOperatorByID(/<code><code>int/<code> <code>id)/<code>
<code> /<code><code>{/<code>
<code> /<code><code>// 刪除單個信息 SQL 命令/<code>
<code> /<code><code>string sqlTxt = string.Format(/<code><code>"Delete From Operator Where Id = {0}"/<code><code>, id);/<code>
<code> /<code><code>// 創建 SQL 執行對象/<code>
<code> /<code><code>DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance();/<code>
<code> /<code><code>// 執行 刪除操作/<code>
<code> /<code><code>int/<code> <code>rowsAffected;/<code>
<code> /<code><code>dbProvider.RunCommand(sqlTxt, out rowsAffected);/<code>
<code> /<code><code>if/<code> <code>(rowsAffected >= /<code><code>1/<code><code>)/<code>
<code> /<code><code>return/<code> <code>true/<code><code>;/<code>
<code> /<code><code>else/<code>
<code> /<code><code>return/<code> <code>false/<code><code>;/<code>
<code> /<code><code>}/<code>
<code> /<code><code>/// <summary>/<code>
<code> /<code><code>/// 修改操作員/<code>
<code> /<code><code>/// /<code>
<code> /<code><code>/// <param>要修改的操作員實體/<code>
<code> /<code><code>/// <returns>True:成功/False:失敗/<returns>/<code>
<code> /<code><code>public/<code> <code>bool ModifyOperator(Model.Operator currentOperator)/<code>
<code> /<code><code>{/<code>
<code> /<code><code>// 驗證密碼長度/<code>
<code> /<code><code>if/<code> <code>(currentOperator.Password.Trim().Length < /<code><code>6/<code><code>)/<code>
<code> /<code><code>throw/<code> <code>new/<code> <code>Exception(/<code><code>"用戶密碼長度不能小於六位!"/<code><code>);/<code>
<code> /<code><code>// 轉換操作員權限集合為數據庫可存取的 Byte[] 數組/<code>
<code> /<code><code>MemoryStream ms = /<code><code>new/<code> <code>MemoryStream();/<code>
<code> /<code><code>BinaryFormatter bf = /<code><code>new/<code> <code>BinaryFormatter();/<code>
<code> /<code><code>bf.Serialize(ms, currentOperator.RightsCollection);/<code>
<code> /<code><code>byte/<code><code>[] rigthsByteArray = /<code><code>new/<code> <code>byte/<code><code>[(/<code><code>int/<code><code>)(ms.Length)];/<code>
<code> /<code><code>ms.Position = /<code><code>0/<code><code>;/<code>
<code> /<code><code>ms.Read(rigthsByteArray, /<code><code>0/<code><code>, (/<code><code>int/<code><code>)(ms.Length));/<code>
<code> /<code><code>ms.Close();/<code>
<code> /<code><code>// 拼接 SQL 命令/<code>
<code> /<code><code>string sqlTxt = /<code><code>"Update Operator Set OperatorName = @OperatorName, "/<code>
<code> /<code><code>"Password = @Password, RightsList = @RightsList, State = @State Where Id = @Id"/<code><code>;/<code>
<code> /<code><code>// 從配置文件讀取連接字符串/<code>
<code> /<code><code>string connectionString = ConfigurationManager.ConnectionStrings[/<code><code>"SQLSERVER"/<code><code>].ConnectionString;/<code>
<code> /<code><code>// 執行 SQL 命令/<code>
<code> /<code><code>using(SqlConnection conn = /<code><code>new/<code> <code>SqlConnection(connectionString))/<code>
<code> /<code><code>{/<code>
<code> /<code><code>SqlCommand cmd = /<code><code>new/<code> <code>SqlCommand(sqlTxt, conn);/<code>
<code> /<code><code>SqlParameter prm1 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@OperatorName"/<code><code>, SqlDbType.NVarChar, /<code><code>50/<code><code>);/<code>
<code> /<code><code>prm1.Value = currentOperator.ModelName;/<code>
<code> /<code><code>SqlParameter prm2 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@Password"/<code><code>, SqlDbType.NVarChar, /<code><code>50/<code><code>);/<code>
<code> /<code><code>prm2.Value = currentOperator.Password;/<code>
<code> /<code><code>SqlParameter prm3 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@RightsList"/<code><code>, SqlDbType.VarBinary, rigthsByteArray.Length, /<code>
<code> /<code><code>ParameterDirection.Input, /<code><code>false/<code><code>, /<code><code>0/<code><code>, /<code><code>0/<code><code>, /<code><code>null/<code><code>, DataRowVersion.Current, rigthsByteArray);/<code>
<code> /<code><code>SqlParameter prm4 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@State"/<code><code>, SqlDbType.Bit);/<code>
<code> /<code><code>prm4.Value = currentOperator.State;/<code>
<code> /<code><code>SqlParameter prm5 = /<code><code>new/<code> <code>SqlParameter(/<code><code>"@Id"/<code><code>, SqlDbType.Int);/<code>
<code> /<code><code>prm5.Value = currentOperator.Id;/<code>
<code> /<code><code>cmd.Parameters.AddRange(/<code><code>new/<code> <code>SqlParameter[] { prm1, prm2, prm3, prm4, prm5 });/<code>
<code> /<code><code>conn.Open();/<code>
<code> /<code><code>if/<code> <code>(cmd.ExecuteNonQuery() >= /<code><code>1/<code><code>)/<code>
<code> /<code><code>return/<code> <code>true/<code><code>;/<code>
<code> /<code><code>else/<code>
<code> /<code><code>return/<code> <code>false/<code><code>;/<code>
<code> /<code><code>}/<code>
<code> /<code><code>}/<code>
<code> /<code><code>/// <summary>/<code>
<code> /<code><code>/// 獲取所有操作員信息/<code>
<code> /<code><code>/// /<code>
<code> /<code><code>/// <returns>操作員實體集合/<returns>/<code>
<code> /<code><code>public/<code> <code>Dictionary<string> GetAllOperatorInfo()/<string>/<code>
<code> /<code><code>{/<code>
<code> /<code><code>//SQL命令/<code>
<code> /<code><code>string sqltxt = /<code><code>"Select Id, OperatorName, Password, RightsList, State From Operator"/<code><code>;/<code>
<code> /<code><code>//創建操作員實體集合/<code>
<code> /<code><code>Dictionary<string> operatorCollection = /<string>/<code><code>new/<code> <code>Dictionary<string>();/<string>/<code>
<code> /<code><code>//定義操作員實體/<code>
<code> /<code><code>Model.Operator tmpOperator = /<code><code>null/<code><code>;/<code>
<code> /<code><code>// 轉換數據庫存儲的 二進制數據為 Byte[] 數組 以便進而轉換為操作員權限集合/<code>
<code> /<code><code>// 從配置文件讀取連接字符串/<code>
<code> /<code><code>string connectionString = ConfigurationManager.ConnectionStrings[/<code><code>"SQLSERVER"/<code><code>].ConnectionString;/<code>
<code> /<code><code>// 執行 SQL 命令/<code>
<code> /<code><code>using (SqlConnection conn = /<code><code>new/<code> <code>SqlConnection(connectionString))/<code>
<code> /<code><code>{/<code>
<code> /<code><code>SqlCommand cmd = /<code><code>new/<code> <code>SqlCommand(sqltxt, conn);/<code>
<code> /<code><code>conn.Open();/<code>
<code> /<code><code>using (SqlDataReader myReader = cmd.ExecuteReader(/<code>
<code> /<code><code>CommandBehavior.CloseConnection))/<code>
<code> /<code><code>{/<code>
<code> /<code><code>while/<code> <code>(myReader.Read())/<code>
<code> /<code><code>{/<code>
<code> /<code><code>// 創建操作員實體/<code>
<code> /<code><code>tmpOperator = /<code><code>new/<code> <code>Model.Operator();/<code>
<code> /<code><code>//將數據集轉換成實體集合/<code>
<code> /<code><code>tmpOperator.Id = Convert.ToInt32(myReader[/<code><code>"Id"/<code><code>]);/<code>
<code> /<code><code>tmpOperator.ModelName = Convert.ToString(myReader[/<code><code>"OperatorName"/<code><code>]);/<code>
<code> /<code><code>tmpOperator.Password = Convert.ToString(myReader[/<code><code>"Password"/<code><code>]);/<code>
<code> /<code><code>tmpOperator.State = Convert.ToBoolean(myReader[/<code><code>"State"/<code><code>]);/<code>
<code> /<code><code>// 讀取權限集合/<code>
<code> /<code><code>System.Data.SqlTypes.SqlBytes bytes = myReader.GetSqlBytes(/<code><code>3/<code><code>); /<code><code>// 只能指定列序號/<code>
<code> /<code><code>// 將流反序列化為權限集合對象/<code>
<code> /<code><code>BinaryFormatter bf = /<code><code>new/<code> <code>BinaryFormatter();/<code>
<code> /<code><code>if/<code> <code>(!bytes.IsNull)/<code>
<code> /<code><code>tmpOperator.RightsCollection = (bf.Deserialize(bytes.Stream) as Dictionary<string>);/<string>/<code>
<code> /<code><code>// 添加到操作員實體集合/<code>
<code> /<code><code>operatorCollection.Add(tmpOperator.ModelName, tmpOperator);/<code>
<code> /<code><code>}/<code>
<code> /<code><code>}/<code>
<code> /<code><code>}/<code>
<code> /<code><code>// 返回結果/<code>
<code> /<code><code>return/<code> <code>operatorCollection;/<code>
<code> /<code><code>}/<code>
<code> /<code><code>/// <summary>/<code>
<code> /<code><code>/// 根據操作員名稱校驗操作員是否存在/<code>
<code> /<code><code>/// /<code>
<code> /<code><code>/// <param>操作員名稱/<code>
<code> /<code><code>/// <returns>True:存在/Flase:不存在/<returns>/<code>
<code> /<code><code>public/<code> <code>bool CheckOperatorExist(string operatorName)/<code>
<code> /<code><code>{/<code>
<code> /<code><code>//創建查詢信息的 SQL/<code>
<code> /<code><code>string sqlTxt = string.Format(/<code>
<code> /<code><code>"Select Count(*) From Operator Where OperatorName = '{0}'"/<code><code>, /<code>
<code> /<code><code>operatorName);/<code>
<code> /<code><code>//創建SQL執行對象/<code>
<code> /<code><code>DBUtility.AbstractDBProvider dbProvider = DBUtility.AbstractDBProvider.Instance();/<code>
<code> /<code><code>//執行查詢操作/<code>
<code> /<code><code>int/<code> <code>result = Convert.ToInt32(dbProvider.RunCommand(sqlTxt));/<code>
<code> /<code><code>if/<code> <code>(result >= /<code><code>1/<code><code>)/<code>
<code> /<code><code>return/<code> <code>true/<code><code>;/<code>
<code> /<code><code>else/<code>
<code> /<code><code>return/<code> <code>false/<code><code>;/<code>
<code> /<code><code>}/<code>
<code> /<code><code>#endregion/<code>
/<tbody>/<table>