統一身份認證子系統資料庫設計與資料訪問層實現

來源:互聯網
上載者:User
訪問|設計|資料|資料庫|資料庫設計 目 錄









一 引言……………………………………………………………………………………1

二 需求分析

(一)系統的功能要求………………………………………………………………2

(二)系統的效能要求………………………………………………………………2

(三)運行環境要求…………………………………………………………………2

(四)開發工具簡介…………………………………………………………………2

三 總體設計

(一)系統模組化分…………………………………………………………………2

(二)設計思想及結構層次圖………………………………………………………3

四 資料庫設計

(一) 資料庫模型圖…………………………………………………………………5

(二) 資料表設計……………………………………………………………………5

(三) 視圖……………………………………………………………………………7

五 資料訪問層的詳細設計………………………………………………………………7

六 總結……………………………………………………………………………………9

七 致謝…………………………………………………………………………………10

主要參考文獻…………………………………………………………………………10

附錄………………………………………………………………………………………10











統一身份認證子系統資料庫設計與資料訪問層實現



石 春 麗

西南師範大學電腦與資訊科學學院 重慶 400715



摘要:統一身份認證子系統(UIA子系統)統一系統管理使用者和校園內各個分應用系統(成員網站)。每個註冊的校園網使用者擁有統一的網路賬戶(使用者名稱/密碼),使用者通過同一個使用者名稱/密碼,可以訪問校園內的所有校網路應用系統(成員網站),為使用者應用提供統一身份認證和單點登入服務。該論文主要內容包括該系統需求分析、總體設計、資料庫的設計和資料訪問層的詳細設計與實現。

關鍵詞:使用者,成員網站,使用者角色



Abstract: Unique Identity Authentication subsystem (UIA ) manages users and each branch application system(member site ) in campus in unison. Each registered campus network user has unified network accounts (user name / the password), users can visit the schools network application system(member site) in the campus by the same user name / the password, apply to users’ application the services that unify identity authentication and some single log-in. This thesis main contents include system demand analyse , overall design ,database design and detailed design and realization of data access layer.



一、引言

對於校園內部的各個應用系統,使用者使用時必須在每個系統中都註冊,登入,比較麻煩,同時 也容易造成混亂,更帶來資料資源的重複儲存。因此需要一個專門的系統對使用者進行統一管理,即使用者只需要註冊登入一次就可以使用各不同應用系統。當然對於各個不同的應用系統,為了使用者的使用方便,也對其進行一個邏輯上的統一管理。因此開發UIA(統一身份認證)系統是很有必要的。當應用系統註冊到在UIA後,我們稱之為成員網站。

對使用者的統一管理,一方面用在訪問各個成員網站時無需多次註冊登入,既給使用者的使用帶來方便,也為成員網站節約資源,避免各個成員網站分散管理統一使用者帶來的資料冗餘。另一方面也給新的成員網站(新的應用系統)的開發提供方便。

對成員網站進行統一管理,一方面給使用者的操作帶來方便,即使用者登入UIA子系統後就可以直接通過連結對各成員網站進行訪問。另一方面對於成員網站只需要在該系統中註冊時給出不同使用者的角色類型,便可對各類使用者進行許可權控制,由該系統完成對使用者的許可權分配。因此開發UIA子系統(統一身份認證子系統),由小組討論完成需求分析和總體設計(模組劃分)中部分工作,由我負責資料庫設計和資料訪問層的代碼編寫工作。

二 、需求分析

(一)系統功能要求

UIA子系統要實現兩大功能,一是對使用者和系統的身份認證,二是對使用者與成員網站之間的許可權控制。通過使用者的身份和成員網站對使用者的許可權分配使用者可在該系統中獲得訪問某成員網站的許可權,通過系統的身份和使用者對成員網站的許可權控制,成員網站可在該系統中獲得察看使用者資訊的許可權。

(二)系統效能要求

UIA子系統將會管理海量的使用者和成員網站資訊,這對UIA子系統的效能要求很高,同時多網路的效能要求也很高,所以要求UIA子系統首先要有容量很大的存放裝置,同時要求有較大的頻寬,保證大量使用者在訪問時不會發生網路阻塞。

(三)運行環境要求

.net平台,SQLSERVER資料庫,IIS伺服器

(四)開發工具簡介

Microsoft SQL Sever是高效能客戶/伺服器關聯式資料庫管理系統。有許多重要的新特性,如透明分散式處理、簡明管理、基於對象嵌入與連結技術(0LE)的程式設計介面,以及與Internet的整合等,選擇Microsoft SQL Sever最重要的原因是它的可擴充性和較高的安全性。因為Microsoft SQL Sever是基於多線程式並行資料庫核心,它能夠發揮附加處理器的優勢,在許多情況下,只有使用特定的並行資料庫和作業系統才能獲得對對稱式多處理技術的支援;當然它還具備很高的安全性,對使用者資料進行有效保護。

三 、總體設計

(一)UIA子系統模組劃分

統一身份認證子系統(UIA)主要有兩大功能模組:身份認證模組和許可權管理模組。

身份認證模組系統管理使用者身份和成員網站身份。向使用者提供線上註冊功能,使用者註冊時提供必須資訊(如使用者名稱、密碼)該資訊即為使用者身份的唯一證據,擁有該資訊的使用者即為UIA子系統的合法使用者;身份認證模組還向成員網站提供線上註冊功能,成員網站註冊時需提供一些關於成員網站的基本資料,還包括為使用者定義的角色種類(如普通使用者、進階使用者、管理使用者)。

許可權管理模組主要有:成員網站對使用者的許可權控制、使用者對成員網站的許可權控制、成員網站對成員網站的許可權控制。使用者向某成員網站申請分配許可權時,需向該成員網站提供他的某些資訊,這些資訊就是使用者提供給成員網站的許可權,而成員網站通過UIA身份認證後就可以查詢使用者資訊,並給該使用者指派許可權,獲得許可權的使用者通過UIA身份認證後就可以以某種身份訪問該成員網站。成員網站對成員網站的許可權控制主要是成員網站控制向其它成員網站提供的調用介面。

UIA還包括系統維護模組和使用協助模組,系統維護模組主要功能是成員網站的管理和對系統資料的維護。

UIA還提供一套SDK,供各成員網站開發時使用。如使用者訪問某成員網站時,UIA提供返回使用者權限的函數,供成員網站調用。

(二)設計思想及結構層次圖

1.系統總體設計思想描述如下:




使用者可以進行單點登入,也就是使用者通過UIA子系統的身份認證後,就可以訪問UIA子系統的所有的該使用者擁有許可權的成員網站,使用者在訪問完一個網站後,不需要再次通過認證就可以訪問他擁有許可權的網站,同時向成員網站返回他相應的存取權限;集中式授權控制是使用者向成員網站申請授權,使用者在向網站申請許可權時,提供想讓網站看到的資訊,即向成員網站申請授權;成員網站也向使用者授權,使用者向網站申請許可權後,網站就可以為該使用者開通,使用者就獲得了在該網站的許可權;還為成員網站提供管理功能,包括管理其基本資料和其成員使用者的許可權,包括為使用者開通許可權,禁用使用者的許可權。
2.整個系統結構層次關係描述圖:




主要說明了在開發時所用的開發模式:.net層次化開發,也就是microsoft推薦的開發方式。主體部分主要有三個層:商務邏輯層、商務外觀層、資料庫訪問層。其中商務外觀層主要定義一些基本的操作,可以調用商務邏輯層,也可以調用資料庫訪問層和Model層,商務邏輯層主要是定義一些操作的規則,可以調用資料庫訪問層和Model層,資料庫訪問層主要是具體的對資料庫的操作,可以調用Model層,通過這種層層調用來實現系統的主體功能;WebService層可以調用商務邏輯層,資料庫訪問層和Model層,WebUI主要是提供給使用者的介面,體現系統的實際功能,可以訪問商務外觀層和Model層,Model層主要功能是實現層間的資料傳遞,可以被其他層調用。採用這種開發方式主要是有利於系統的維護和今後的系統擴充,如果某一層出現問題或需要更新某一層的功能,只需要修改相應的那一層,不需要修改其他層,這樣就可以問題局部化,便於解決問題。

四、資料庫設計

UIA是一個動態資訊管理系統必須是在Internet/Intranet技術的基礎上,基於Web方式而建立用戶端與伺服器端的聯絡,我們構建這個資料庫的目的一方面有效安全的儲存使用者的註冊資訊,同時方便成員網站對使用者的許可權控制和資訊的查詢,因此該資料庫系統應該具有較高的安全性,另外為方便新的成員網站的加入,該系統也必須有對外開放功能的資料庫。為此,我們考慮選用Microsoft SQL Sever 2000作為資料庫管理系統,建立一個易於實現資料共用,集業務處理、資料分析、資料查詢於一體並能保障資料高效安全的資料庫系統,根據實際的需要,資料庫內容主要分為兩大部分,一是的成語網站的基本資料,包括網站地址,網站名,網站是否開通等的資訊資料,二是使用者的各種資訊資料,故資料庫應包含四個必不可少的表單:

(一)資料庫模型圖:




(二)資料表的設計

1.成員網站資訊表(TSites):




該資料表用來儲存成員網站的基本資料。

其中USID欄位由系統自動產生,系統統一標誌符表示,SiteID即成員網站號是該資料表的關鍵字段,由它唯一標誌成員網站,對它規定用4位整形表示;Url表示成員網站的網址,SiteName表示網站的網名,二者都用可變長字串表示,但不能超過50個字元;;SiteEnable標誌位,標誌當前該網站是否開通,是否可以訪問,用一位字元表示,當取值為“1”,表示網站開通,反之未開通;

2.使用者資訊表(TUsers):




該資料表格儲存體使用者的基本資料,也是使用者註冊時需要填寫的資訊。

其中UUID欄位是系統自動產生的,UserID表示使用者號,是關鍵字段,由它來區別不同的使用者;NikeName表示使用者暱稱,用可變長字串來表示,但長度不能超過50;Email表示使用者郵箱,PassWord使用者密碼,二者用50個以內的可變長字串表示;UserEnable標誌位,標誌該使用者是否開通,即註冊資訊是否生效,用一位字元表示,取值“1”是為真即開通,反之為假即未開通;另外為了防止使用者登入時密碼遺忘,設定密碼提示,用提問的方式協助使用者找回密碼,Question是使用者註冊時填寫的密碼提示問題,Answer是密碼提示答案,二者均用可變長字串表示,要求長度在100之內。

3.使用者在某成員網站中的角色(TUserRoles):




該表格儲存體不同成員網站用分配的角色類 型。

其中RoleID表示角色號,是該資料表的關鍵字段,它唯一標誌某個角色,規定用4位整形表示,SiteID表示成員網站號,RoleName表示角色名稱,用50位以內的可變長字串表示,CanAdminSite標誌該角色是否具有對SiteID欄位標誌的成員網站的管理權,如果為“1”表示該角色具備此許可權,如果為“0”則不具備,一般來講,對一個成員網站,只有一種角色的該欄位取值為“1”,其他均為“0”。

4.成員網站對使用者指派的角色類型(TRoles):




RoleID表示角色號,UserID表示使用者號是該資料表的關鍵字段,均用4位整形表示,由二者來唯一確定某個使用者的某種角色。RoleEnabled表示使用者角色是否開通,用一位元據表示,取值為“1”,表示使用者角色開通,即該使用者當前可以訪問某成員網站,反之則沒有開通。

(二)系統中所用到的視圖:

Vsites: 該視圖的建立主要為了方便查詢成員網站中的使用者角色。




VUsers: 該視圖的建立主要為了方便查詢使用者的資訊,包括使用者在各個成員網站中的角色。




五、資料訪問層的詳細設計:

根據系統功能需求和資料庫的設計可得出對資料庫的訪問主要包括四大部分:1,對成員網站資訊表(TSites)的訪問;2,對使用者資訊表(TUsers)的訪問;3,對使用者在某成員網站中的角色(TuserRoles)的訪問;4,對成員網站對使用者指派的許可權(角色)類型(TRoles)的訪問;因此我們分別用下面四個類來實現:

(1)public class Sites

該類包含以下函數:

public int CreateSite(SiteData site)在資料庫中添加一個新的成員網站資訊。其參數是一個SiteData類型資料,SiteData是由Model層定義的資料類型,從資料庫中擷取的資訊是SqlDataReader類型,需要將其轉換成Model層中的SiteData類型便於層間資料的傳遞。

public int UpdateSite(SiteData site) 修改資料庫中某個成員網站資訊

public int RemoveSite(System.Guid usid) 刪除資料庫中某個使用者,其參數為成員網站註冊時資料表中系統自動產生的編號usid

public SiteData GetSite(System.Guid usid)根據成員網站註冊時系統自動分配的編號usid來查詢該成員網站的所有資訊,傳回型別為Model層中的SiteData類型。

public IList ListSites()查詢並列出所有成員網站資訊,用鏈表Ilist返回,Ilist中的每一項的資料類型SiteData

(2)public class Users

該類包含以下函數:

public int CreateUser(UserData user)在資料庫中添加一個新使用者,參數為UserData類型,其含義與SiteData相同。

public int UpdateUser(UserData user)修改資料庫中某個使用者資訊。

public int RemoveUser(string nickname)刪除資料庫中某個使用者,其參數為使用者資訊中的nickname

public UserData GetUser(string nickname)根據nickname查詢使用者所有資訊,傳回型別為Model層中的UserData類型。

public IList ListUsers()查詢所有使用者資訊返回鏈表Ilist,Ilist中的每一項的資料類型UserData

(3) public class UserRoles

該類包含以下函數:

private int GetRoleID(string role,int siteid)擷取角色號,其參數為某個成員網站的siteid以及某個角色名稱。

public int AddUserRole(UserRoleData userrole)添加使用者角色

public int RemoveUserRole(UserRoleData userrole)刪除一個使用者角色

public UserRoleData GetUserRole(int userid,int siteid)擷取使用者在某個成員網站中的角色

public IList ListAllUsersInSite(System.Guid usid)查詢所有成員網站

(4) public class UserRoleRules

該類包含以下函數:

public bool RequestRole(string nickname,string role,System.Guid usid)申請使用者角色

public bool EnableUserRole(string nickname,System.Guid usid)開通使用者角色

public bool DisableUserRole(string nickname,System.Guid usid)禁用使用者角色

public bool RemoveRole(string nickname,System.Guid usid)刪除使用者角色

public bool IsInRole(string nickname,string role,System.Guid usid)判斷某使用者是否具備某許可權

public bool IsRoleEnabled(string nickname,string role,System.Guid usid)判斷使用者角色是否被開通

(5)DAConfig

為了簡化以上各個類對資料庫訪問時參數設定,特增設DAConfig類。該類了從設定檔中讀取資料庫連接字串,即擷取UIA子系統中資料庫伺服器所在的位置,資料庫的名稱,使用者名稱和密碼,將這些內容封裝起來直接提供給其他類訪問資料庫時調用(為資料訪問層中的函數調用準備參數),簡化了其他類中資料存取碼。

六、總結:

通過小組各成員的努力,系統基本成形,基本實現預期功能。通過此次畢業設計,我對.NET技術有了一定的瞭解,在資料庫的設計方面積累了寶貴的經驗。隨著開發過程的不斷深入,我對軟體開發有了更加深刻的認識,動手能力也得到了很好的鍛煉。在豐富知識和積累經驗的同時,我的團結協作工作能力也在小組成員的不斷交流中得到提高。這些都將使我在今後的學習工作中大受裨益。但由於個人能力有限,時間倉促,系統尚有不足之處,請各位老師提出寶貴意見。

七、致謝:

本次畢業設計能夠順利完成離不開我們指導老師鄒顯春老師的指導和協助,盧心紅老師、陳武老師、聞曉老師、李運剛老師在此過程中也給予了極大的協助,對他們的協助表示衷心的感謝。還有小組所有成員對我的大力支援,在此對他們表示衷心的感謝!





主要參考文獻:

[1]凡若切提..Net資料服務C#進階編程. 清華大學出版社

[2]溫謙等.C#編程技術.人民郵電出版社

[3]閃四清.SQL Sever 2000資料庫管理系統.北京希望電子出版社



附錄:

附資料訪問層部分原始碼

namespace DataAccess

{

/// <summary>

/// DAConfig 的摘要說明。

/// </summary>

public class DAConfig

{



public static string ConnectionString

{

get

{

return ConfigurationSettings.AppSettings["ConnectionString"].ToString();

}

}

}

}

using System;

using System.Collections;

using System.Data;





using System.Data.SqlClient;

using Microsoft.ApplicationBlocks.Data;

using Model;

namespace DataAccess

{

public class Sites

{

public int CreateSite(SiteData site)

{

//準備SQL參數

SqlParameter[] ms=new SqlParameter[6];

ms[0]=new SqlParameter("@SiteID",SqlDbType.Int);

ms[1]=new SqlParameter("@SiteName",SqlDbType.NVarChar);

ms[2]=new SqlParameter("@Url",SqlDbType.NVarChar);

ms[3]=new SqlParameter("@SiteEnabled",SqlDbType.Bit);

ms[4]=new SqlParameter("@RoleName",SqlDbType.NVarChar);

ms[5]=new SqlParameter("@CanAdminSite",SqlDbType.NVarChar);

//給參數賦值

ms[1].Value=site.SiteName;

ms[2].Value=site.Url;

ms[3].Value=site.Enabled;

//插入網站的參數化SQL語句

string sql="insert into TSites(SiteName,Url,SiteEnabled) values(@SiteName,@Url,@SiteEnabled)";

//調用DAB層的函數執行操作

int i=SqlHelper.ExecuteNonQuery(DAConfig.ConnectionString,CommandType.Text,sql,ms);

//查詢出自動產生的欄位值

sql="select USID,SiteID from TSites where SiteName=@SiteName";

SqlDataReader reader=SqlHelper.ExecuteReader(DAConfig.ConnectionString,CommandType.Text,sql,ms);

while(reader.Read())

{

site.USID=reader.GetGuid(0);

site.SiteID=reader.GetInt32(1);

}

//插入網站的角色參數化語句

sql="insert into TRoles (SiteID,RoleName,CanAdminSite) values(@SiteID,@RoleName)";

ms[0].Value=site.SiteID;

for(int j=0;j<site.Roles.Count;j++)

{

//給SQL參數賦值

ms[4].Value=((SiteData.Role)site.Roles[j]).RoleName;

ms[5].Value=((SiteData.Role)site.Roles[j]).CanAdminSite;

SqlHelper.ExecuteNonQuery(DAConfig.ConnectionString,CommandType.Text,sql,ms);

}

//查詢出該網站的所有角色,並進行資料格式轉換

sql="select RoleID,RoleName,CanAdminSite from TRoles where SiteID=@SiteID";

SqlDataReader r2=SqlHelper.ExecuteReader(DAConfig.ConnectionString,CommandType.Text,sql,ms);

while(r2.Read())

{

site.Roles.Add(new Model.SiteData.Role(r2.GetInt32(0),r2.GetString(1),r2.GetBoolean(2) ));

}

return i;

}

//更改使用者資訊

public int UpdateSite(SiteData site)

{

//準備SQL參數

SqlParameter[] ms=new SqlParameter[7];

ms[0]=new SqlParameter("@USID",SqlDbType.UniqueIdentifier);

ms[1]=new SqlParameter("@SiteID",SqlDbType.Int);

ms[2]=new SqlParameter("@SiteName",SqlDbType.NVarChar);

ms[3]=new SqlParameter("@Url",SqlDbType.NVarChar);

ms[4]=new SqlParameter("@Enabled",SqlDbType.Bit);

ms[5]=new SqlParameter("@RoleName",SqlDbType.NVarChar);

ms[6]=new SqlParameter("@RoleID",SqlDbType.Int);

//給參數賦值

ms[0].Value=site.USID;

ms[1].Value=site.SiteID;

ms[2].Value=site.SiteName;

ms[3].Value=site.Url;

ms[4].Value=site.Enabled;

//修改網站基本資料參數化SQL語句

string sql="update TSites set SiteName=@SiteName,Url=@Url,SiteEnabled=@SiteEnabled where SiteID=@SiteID";

int i=SqlHelper.ExecuteNonQuery(DAConfig.ConnectionString,CommandType.Text,sql,ms);

sql="update TRoles set RoleName=@RoleName where RoleID=@RoleID";

for(int j=0;j<site.Roles.Count;j++)

{

ms[5].Value=((SiteData.Role)site.Roles[j]).RoleName;

ms[6].Value=((SiteData.Role)site.Roles[j]).RoleID;

SqlHelper.ExecuteNonQuery(DAConfig.ConnectionString,CommandType.Text,sql,ms);

}

return i;

}

//刪除一個網站

public int RemoveSite(System.Guid usid)

{

//準備SQL參數

SqlParameter[] ms=new SqlParameter[1];

ms[0]=new SqlParameter("@USID",SqlDbType.UniqueIdentifier);

ms[0].Value=usid;

//參數化SQL語句

string sql="delete from TSites where USID=@USID";

//調用DAB層函數執行操作

return SqlHelper.ExecuteNonQuery(DAConfig.ConnectionString,CommandType.Text,sql,ms);

}

//查詢網站資訊

public SiteData GetSite(System.Guid usid)

{

//準備SQL參數

SqlParameter[] ms=new SqlParameter[2];

ms[0]=new SqlParameter("@USID",SqlDbType.UniqueIdentifier);

ms[1]=new SqlParameter("@SiteID",SqlDbType.Int);

ms[0].Value=usid;

//參數化SQL語句

string sql="select USID,SiteID,SiteName,Url,SiteEnabled from TSites where USID=@USID";

//調用DAB層函數執行操作

SqlDataReader reader=SqlHelper.ExecuteReader(DAConfig.ConnectionString,CommandType.Text,sql,ms);

SiteData data=null;

while(reader.Read())

{

data=new SiteData(reader.GetGuid(0),reader.GetInt32(1),reader.GetString(2),reader.GetString(3),reader.GetBoolean(4));

}

//參數化SQL語句

sql="select RoleID,RoleName,CanAdminSite from TRoles where SiteID=@SiteID";

ms[1].Value=data.SiteID;

//調用DAB層函數執行操作

SqlDataReader r2=SqlHelper.ExecuteReader(DAConfig.ConnectionString,CommandType.Text,sql,ms);

while(r2.Read() )

{

data.Roles.Add(new SiteData.Role(r2.GetInt32(0),r2.GetString(1),r2.GetBoolean(2)));

}

return data;

}

//查詢所有的使用者

public IList ListSites()

{

//傳回值是一個鏈表

IList ret=new ArrayList();

SqlParameter[] ms=new SqlParameter[1];

ms[0]=new SqlParameter("@SiteID",SqlDbType.Int);

//參數化SQL語句

string sql="select USID,SiteID,SiteName,Url,SiteEnabled from TSites ";

//調用DAB層函數執行操作

SqlDataReader reader=SqlHelper.ExecuteReader(DAConfig.ConnectionString,CommandType.Text,sql,null);

while(reader.Read())

{

SiteData data=null;

data=new SiteData(reader.GetGuid(0),reader.GetInt32(1),reader.GetString(2),reader.GetString(3),reader.GetBoolean(4));

sql="select RoleID,RoleName,CanAdminSite from TRoles where SiteID=@SiteID";

ms[0].Value=data.SiteID;

//調用DAB層函數執行操作

SqlDataReader r2=SqlHelper.ExecuteReader(DAConfig.ConnectionString,CommandType.Text,sql,ms);

while(r2.Read() )

{

//進行格式轉換,並插入鏈表

data.Roles.Add(new SiteData.Role(r2.GetInt32(0),r2.GetString(1),r2.GetBoolean(2)));

}

ret.Add(data);

}

return ret;

}

}

}




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。