




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
畢業設計說明書通用權限管理系統設計與開發軟件學院0821940246葛飛霞學生姓名:學號:軟件學院0821940246葛飛霞軟件技術學院:軟件技術馮傳春專業:馮傳春指導教師:2021年6月通用權限管理系統設計與開發 摘要權限管理一直以來都是每個應用系統不可缺少的局部,而且幾乎是每個應用系統都重新對系統的權限進行重新設計,以滿足不同系統用戶的需求,目前很少對權限管理形成一套通用、靈活、完全可復用且易嵌入應用系統的組件模塊。本文實現了一個通用的權限管理系統。該系統可以實現通用權限管理,能夠用于任何需要使用權限管理的系統,使得其他系統的開發事倍功半,提高代碼重用率,節省時間,提高開發效率。本論文從系統需求分析、總體設計、詳細設計、系統實現和系統測試這五個角度對系統的開發過程進行了詳細的介紹,并對該系統的主要特點以及采用的主要開發工具進行了簡單的介紹。關鍵詞:權限管理,JSP,SQLServerUniversalRightsManagementSystemDesignandDevelopmentAbstractRightsmanagementsystemforeachapplicationhasbeenanintegralpartof,andalmosteveryapplicationonthesystemofprivilegesarere-re-designedtomeettheneedsofusersofdifferentsystems,thereislittleontheformationofacommonsetofrightsmanagement,flexible,fullyreusableandeasytoembeddedapplicationsystemcomponentmodules.Thisarticleimplementsageneralrightsmanagementsystem.Thesystemcanachieveuniversalrightsmanagement,canbeusedforanyneedtouserightsmanagementsystem,makingthedevelopmentofothersystems,duplicationofefforts,improvecodereuse,tosavetimeandimprovedevelopmentefficiency.
Thethesisfromsystemrequirementsanalysis,design,detaileddesign,systemtestingandsystemtoachievethefivepoint,carryondetailedintroduction.Andcombinedtocarryonsimpleintroductiontothemaincharacteristicsofthatsystemandthemainsystemdevelopmenttools.KeyWords:Generalrightsmanagement,JSP,SQLServer目錄TOC\o"1-3"\h\z1引言 1編寫目的 1工程背景及歷史意義 12系統開發工具介紹 32.1SQL簡介 32.2JSP技術 42.3Tomcat 63系統規劃與系統分析 73.1根本概念 7權限控制的根本原理 83.3數據庫需求分析 114系統設計與實現 124.1系統設計 124.1.1數據庫設計 124.1.2權限類設計 134.2系統實現 194.2.1權限類實現 194.2.2用戶列表實現 374.2.3用戶權限實現 395系統測試 41測試環境 41測試過程 415.3測試結果 426軟件開發中主要解決的問題 43數據庫的平安性 43模塊的獨立性 44結論 46參考文獻 48致謝 491引言權限管理一直以來都是每個應用系統不可缺少的局部,而且幾乎是每個應用系統都重新對系統的權限進行重新設計,以滿足不同系統用戶的需求,目前很少對權限管理形成一套通用、靈活、完全可復用且易嵌入應用系統的組件模塊。本系統開發的目的,就是希望能夠實現一個通用的權限管理系統。該系統可以實現通用權限管理,能夠用于任何需要使用權限管理的系統,使得其他系統的開發事倍功半,提高代碼重用率,節省時間,提高開發效率。及歷史意義隨著網絡技術的迅速開展,電子商務,電子政務和商業應用系統等系統的開展不但需要保護系統資源不受侵犯,更需要為適當的訪問者提供最大化的效勞,這就要求系統必須要能夠控制:哪些訪問者能夠訪問系統的信息,訪問者訪問的是“什么信息〞,訪問者對他所訪問的數據擁有什么樣的“權限〞。可以用“who對what(which)是否能進行how的操作〞來表述應用系統權限的需求。這就涉及到網絡平安的重要內容:權限管理與訪問控制。訪問控制是信息平安保障機制的核心內容,它是實現數據保密性和完整性機制的主要手段。訪問控制是為了限制訪問主體〔或稱為發起者,是一個主動的實體:如用戶、進程、效勞等〕,對訪問客體〔需要保護的資源〕的訪問權限,從而使計算機系統在合法范圍內使用,訪問控制機制決定用戶及代表一定用戶利益的程序能做什么,及做到什么程度。傳統的應用系統通常是通過使用用戶名+口令的方式來實現訪問控制的。系統通過驗證用戶登錄系統是輸入的用戶名和口令確定用戶的身份,同時,系統通過維護一張訪問控制列ACL表確定每個用戶對特定系統對象,例如文件目錄或數據庫的操作權限,這種方法因為簡便易行而得到了普遍的應用。但是對于一些大型組織機構來說,其應用系統較多,用戶數量巨大,采用這種方式需要不同的應用系統分別針對保護的資源進行權限的管理和控制,因而產生了一些問題:1.權限管理混亂對一個組織機構而言,數據和人力資源都是統一的。但是由于系統設計的原因,可能同時對相同的人員采用不同的管理方式,對機構內的共享數據采用了不同的權限分配策略,這顯然不合理,也不利于對機構資源的管理。2.系統平安性較低不同的權限管理策略產生的平安強度是不同的。這就可能造成機構信息平安管理的漏洞,因此入侵者就有可能瞄準那些權限管理相對不平安的系統進行集中攻擊,這就給機構資源的平安性帶來極大的危害。3.權限管理依賴于訪問控制應用權限的賦予和撤銷往往都是在訪問控制應用中產生的,不同的訪問控制應用之間盡管有相同的用戶和授權策略卻往往不能互相使用對方的權限。每個應用都要維護自己的用戶信息和授權方法,權限無法在分布的應用中和遠程應用中使用。4.資源所有者沒有權限應用系統負責權限的發放和使用,造成權限真正的擁有者不能有效,及時地更改,發布實時的權限信息,比方機構內一個人職務或者業務的變化必須通知相關的不用應用中進行更新。而從本質上來講,權限的發放和權限的鑒別使用是完全不同的兩個過程,完全可以分開,權限的擁有者發放權限,而由資源的保護者驗證權限。本系統的意義在于能夠滿足各類應用系統的權限管理需求,做到靈活、通用、方便。具體來說,就是可以對應用系統的所有資源進行權限控制,我們可以把這些資源簡單概括為靜態資源〔功能操作、數據列〕和動態資源〔數據〕,也分別稱為對象資源和數據資源,后者是我們在系統設計與實現中的叫法。為了讓權限操控界面友好且易用,要求對象資源和數據資源的進行樹狀組織。總之,系統的目標就是對應用系統的所有對象資源和數據資源進行權限控制,比方應用系統的功能菜單、各個界面的控件、數據顯示的列以及各種動態數據進行權限的操控。2系統開發工具介紹2.1SQL簡介SQL(StructuredQueryLanguage),意思為結構化查詢語言,是一種介于關系代數與關系演算之間的結構化查詢語言。它的主要功能就是同各種數據庫建立聯系,進行溝通。ANSI〔美國國家標準協會〕規定SQL是關系型數據庫管理系統的標準語言。SQL語句可以用來執行各種各樣的操作,例如更新數據庫中的數據、從數據庫中提取數據等。[1]
SQL語言之所以能夠為用戶和業界所接受,并成為國際標準,是因為它是一個綜合的、功能極強同時又簡捷易學的語言。SQL語言集數據查詢、數據操縱、數據定義和數據控制功能于一體,主要特點包括:(1)綜合統一非關系模型的數據語言一般都分為模式數據定義語言〔模式DDL〕、外模式數據定義語言〔外模式DDL〕、與數據存儲有關的描述語言〔DSDL〕及數據操縱語言〔DML〕,分別用于定義模式、外模式、內模式和進行數據的存取與處置。當擁護數據庫投入運行后,如果需要修改模式,必須停止現有的數據庫的運行,轉儲數據,修改模式并編譯后再重裝數據庫,十分麻煩。SQL語言那么集數據定義語言DDL、數據操縱語言DML、數據控制語言DCL的功能于一體,語言風格統一,可以獨立完成數據庫生命周期中的全部活動,包括定義關系模式、建立數據庫、插入數據、查詢、更新、維護、數據庫重構、數據庫平安性控制等一系列操作要求,這就為數據庫應用系統的開發提供了良好的環境。用戶在數據庫系統投入運行后,還可根據需要隨時地逐步地修改模式,切并不影響數據庫的運行,從而使系統具有良好的可擴展性。(2)高度非過程化非關系數據模型的數據操縱語言是面向過程的語言,用其完成某項請求必須指定存取路徑。而用SQL語言進行數據操作,只要提出“做什么〞,而無須指明“怎么做〞,因此無須了解存取路徑,存取路徑的選擇以及SQL語言句的操作過程由系統自動完成。這不但大大減輕了用戶負擔,而且有利于提高數據獨立性。(3)面向集合的操作方式非關系數據模型采用的是面向記錄的操作方式,操作對象是一條記錄。而SQL語言采用集合操作方式,不僅操作對象、查找結果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。(4)以同一種語法結構提供兩種使用方式SQL語言既是自含式語言,又是嵌入式語言。作為自含式語言,他能夠獨立地用于聯機交互的使用方式,用戶何以在終端鍵盤上直接鍵入SQL命令對數據庫進行操作;作為嵌入式語言,SQL語句能夠嵌入到高級語言中,供程序員設計程序時使用。而在兩種不同的使用方式下,SQL語言的語法結構根本上是一致的。(5)語言簡捷,易學易用SQL語言功能極強,但由于設計巧妙,語言十分簡捷,完成核心功能只用了9個動詞,SQL語言接近英語口語,因此容易學習,容易使用。2.2JSP技術JSP(JavaServerPages)是由SunMicrosystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。JSP技術有點類似ASP技術,它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件(*.jsp)。用JSP開發的Web應用是跨平臺的,即能在Linux下運行,也能在其他操作系統上運行。JSP技術使用Java編程語言編寫類XML的tags和scriptlets,來封裝產生動態網頁的處理邏輯。網頁還能通過tags和scriptlets訪問存在于效勞端的資源的應用邏輯。JSP將網頁邏輯與網頁設計和顯示別離,支持可重用的基于組件的設計,使基于Web的應用程序的開發變得迅速和容易。Web效勞器在遇到訪問JSP網頁的請求時,首先執行其中的程序段,然后將執行結果連同JSP文件中的HTML代碼一起返回給客戶。插入的Java程序段可以操作數據庫、重新定向網頁等,以實現建立動態網頁所需要的功能。JSP與JavaServlet一樣,是在效勞器端執行的,通常返回該客戶端的就是一個HTML文本,因此客戶端只要有瀏覽器就能瀏覽。JSP的1.0標準的最后版本是1999年9月推出的,12月又推出了1.1標準。目前較新的是JSP1.2標準,JSP2.0標準的征求意見稿也已出臺。JSP頁面由HTML代碼和嵌入其中的Java代碼所組成。效勞器在頁面被客戶端請求以后對這些Java代碼進行處理,然后將生成的HTML頁面返回給客戶端的瀏覽器。JavaServlet是JSP的技術根底,而且大型的Web應用程序的開發需要JavaServlet和JSP配合才能完成。JSP具備了Java技術的簡單易用,完全的面向對象,具有平臺無關性且平安可靠,主要面向因特網的所有特點。自JSP推出后,眾多大公司都支持JSP技術的效勞器,如IBM、Oracle、Bea公司等,所以JSP迅速成為商業應用的效勞器端語言。2.3TomcatTomcat效勞器是一個免費的開放源代碼的Web應用效勞器,目前最新版本是(截止到2009-0Tomcat是Apache軟件基金會〔ApacheSoftwareFoundation〕的Jakarta工程中的一個核心工程,由Apache、Sun和其他一些公司及個人共同開發而成。由于有了Sun的參與和支持,最新的Servlet和JSP標準總是能在Tomcat中得到表達,Tomcat5支持最新的Servlet2.4和JSP2.0標準。因為Tomcat技術先進、性能穩定,而且免費,因而深受Java愛好者的喜愛并得到了局部軟件開發商的認可,成為目前比擬流行的Web應用效勞器。Tomcat很受廣闊程序員的喜歡,因為它運行時占用的系統資源小,擴展性好,支持負載平衡與郵件效勞等開發應用系統常用的功能;而且它還在不斷的改良和完善中,任何一個感興趣的程序員都可以更改它或在其中參加新的功能。Tomcat是一個小型的輕量級應用效勞器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP程序的首選。對于一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache效勞器,可利用它響應對HTML頁面的訪問請求。實際上Tomcat局部是Apache效勞器的擴展,但它是獨立運行的,所以當你運行tomcat時,它實際上作為一個與Apache獨立的進程單獨運行的。3系統規劃與系統分析3.1根本概念頁面(URL):在web開發中也稱為URL,最樸素的權限控制,就是基于頁面的控制,即賦予訪問者可以訪問頁面的范圍,在系統記錄所有的頁面,配置權限時,將允許訪問的頁面,賦予使用者.雖然簡單,卻很直接和容易理解.基于這個思想,我們將軟件的URL作為權限,進行控制.在海馬權限系統中,將所有的URL進行記錄.但如果直接將URL作為權限,配置給使用者,是相當麻煩的.因為,一個操作功能,往往不是在一個請求內完成的,這就意味著為了讓使用者有權利完成一個功能,就必須將一組URL賦予使用者,以便其訪問,顯然這樣給系統管理和維護帶來了很多不方便.因此我們定義了下面的概念功能點.功能點:是一組不可分割URL,因為這組URL共同完成一個功能,因此他們是不可分開的.使用者要正常完成操作,就必須有權訪問這組URL中的每一個.這樣,我們將一個功能點賦予使用者,也就意味著這個使用者有訪問這些URL的能力.在業務中,系統管理員不用關心到底什么權限對應哪些URL,只要將功能點賦予使用者,就可以關聯URL了,完成授權過程.角色:角色又可以成為"崗位",它是一組功能點.很多時候,多個使用者的操作權限是相同的,例如一個部門中,大家都有觀察自己郵箱的權利,都有修改自己口令和根本信息的權利,這時,就將郵箱功能點,修改口令,根本信息維護這幾個功能點集合起來,建立一個角色--"操作員崗",那么,在給使用者授權時,只要將這個角色賦予使用者,該使用者就擁有了相應的功能操作權限.適合多使用者權限的管理,尤其是使用者數量眾多,而且權限相同或者類似時,可以減少很多麻煩,減少出錯概率.同時,在海馬權限系統中,一個使用者可以同時擁有多個角色,這些角色所代表的權限,使用者可以同時擁有,是權限的并集.例如一個部門經理可以有"操作員"角色,具備根本的操作權限,同時還可以將"部門審核員"這個角色授予他,這樣可以作操作局部管理功能.這樣做,可以靈活的組合和配置使用者權限,適應復雜權限管理.用戶:是軟件系統使用者的系統賬號.每個使用者,都有自己獨一無二的賬號,系統通過這個賬號來識別不同的使用者.賬號的平安是通過使用者口令加以保護的.口令在系統中是用加密的方式進行保存,防止了通過數據庫系統泄漏使用者口令的問題.(同時可以限制相同賬號在系統登陸,如果發生相同賬號在不同地點同時系統登陸,那么將進行提示.)系統使用者是通過"用戶"與"功能點"關聯,完成使用者的授權,在使用者登陸系統后,也是通過"用戶"來認證當前使用者的權限.單位:是和現實生活中的單位概念相似,在系統中將根據權限要求,將"用戶"劃分到不同的組織內.這種劃分,有兩層含義,從使用者的角度出發,將"用戶"劃分不同組織內,可以清楚的表示出現實的組織關系,方便使用者;從軟件系統的角度,根據"用戶"所在的不同組織,可以清楚的界定出相同類型的數據,在不同用戶下的權限控制,也就是數據的權限控制.例如,天津的銷售經理不能看到北京的銷售部門的合同,這種相同類型的數據,權限控制往往是通過不同單位來控制的.更進一步,在現在的企業集團中,多個相對獨立單位,同時使用系統,并且在單位之間還有一定的關系.海馬權限系統中是通過"弱關聯"來建立組織之間的這種復雜關系.并且可以在組織之間建立網狀關系,即一個單位可以同時指定多個單位成為自己的上級單位,也可以不指定任何上級單位.這種網狀關系,可以容易的表達復雜的組織之間的關系,同時也可以適應單一企業應用的簡單要求.部門:是將單位中用戶進一步分類方法.與現實中的部門相似.部門是為了在單位內進一步劃分用戶,同時有效控制用戶的數據訪問.但部門之間是有關系的.部門首先必須屬于一個單位,不能獨立于單位之外;其次,部門之間是有上下級關系的,有的部門是有自己的上級部門.從這里可以看出,一個單位中,這個單位和它的所有部門都組成了一個樹狀結構.規那么一:每個登陸的用戶,可以有多個角色,規那么二:每個角色又可以訪問多個功能點,規那么三:每個功能點又由多個頁面組成。根據這個對應關系,就可以讓每個用戶對應到不同的頁面,如果進行細致設置,根本上可以解決了應用中的很多情況。如下列圖所示。具體的權限控制過程如下例所示:從上圖,我們可以得到兩個角色: 角色A:監控中心用戶 角色B:車載終端用戶從上圖,我們也可以得到5個功能點: 功能點1:報警 功能點2:打車載 功能點3:查詢車輛位置 功能點4:控制車輛 功能點5:調度信息每個功能點對應的頁面很容易被確定。根據這些資料,就可以編寫一個配置文件,將配置文件放在系統指定的目錄下,權限體系就發生了改變。如果需要改變一個用戶的權限,只需要在用戶管理中,修改用戶的角色。如果需要新增一個角色,那么需要重新編寫配置文件,并將配置文件放在系統指定的目錄下。在創立每個用戶的時候我們要求每個用戶屬于某個單位以及這個單位的某個部門。在系統中的組織結構如下:單位是樹型結構,可以沒有上級單位,可以有下級單位,而且下級單位也可以有下級單位:每個單位內部又有樹型結構的部門結構:而且,通用權限管理系統還應該為每個單位還提供了管理員〔系統管理員〕,他可以創立本單位不同于其它單位的組織結構,并為各個部門創立用戶。這樣我們的權限體系就完整了。我們的每個用戶在登陸本系統后,就可以確定他的所屬單位和部門,并且可以確定他可以使用的各個功能。3.3數據庫需求分析由于權限管理采用了基于角色和操作的方式,因此數據庫表中需要有用戶表、角色表、操作表,結構如下圖:在上圖中添加了UserAction表,使用此表來添加特殊用戶的權限,改表中有一個字段HasPermission可以決定用戶是否有某種操作的權限,改表中記錄的權限的優先級要高于UserRole中記錄的用戶權限。這樣在應用程序中我們就需要通過UserRole和UserAction兩張表中的記錄判斷權限。4系統設計與實現本系統的開發工作分為以下7個主要階段:(1)系統需求分析與系統得功能設計。包括可行性分析,系統詳細調查和用戶需求分析,獲取畢業設計選題過程的業務流程,收集各種用戶對系統的要求,整理相關信息資料,確定系統的開發范圍。(2)數據庫設計。確定數據庫結構,設計數據庫的各種參數,創立實體數據庫和數據庫的標,視圖和觸發器等數據庫對象。(3)程序模塊劃分和實現。根據系統所管理的信息的類型和功能對系統進行模塊劃分,分別編寫代碼,逐一實現系統功能。(4)平安策略設計。根據系統功能劃分用戶類型和權限,并進行平安模型的設計。(5)內部測試。完成系統主體功能后,進行系統內部測試,查找設計缺陷與錯誤,對缺陷和錯誤進行改良和糾正。(6)用戶測試。包括根本功能測試、并發性測試和容錯性測試。(7)工程實施與維護。在用戶對系統認可并確認沒有重大設計缺陷和錯誤的情況下,最終在全院各系進行系統實施,并進行維護。4.1系統設計4.1.1數據庫設計通過以上數據項分析,可以得到本系統需要十張表,分別為:權限表、用戶表、角色表、組表、用戶權限關聯表、用戶角色關聯表、角色權限關聯表、組權限關聯表、組角色關聯表、用戶屬組關聯表。各表及其關系如下:圖權限類設計Permission權限類API
1.本類路徑:
2.方法接口:
publicpermission()說明:類構造方法。
publicResultSetgetRs(Stringsql)throwsSQLException說明:查詢數據庫,獲取記錄集。入口參數為一個SQL語句,返回記錄集。例子:ResultSetrs=permission.getRs("select*fromrigh");詳細用法見。publicbooleannext()throwsSQLException說明:移動指針到下一個記錄,用于操作封裝在對象里的記錄集。入口參數為空,根據操作成功與否返回一個布爾值。例子:permission.next();詳細用法見。
publicStringgetString(Stringstr)throwsSQLException說明:從封裝在對象里的記錄集中取出字段記錄。入口參數為字段名,返回字段的值。例子:permission.getString("字段名");詳細用法見。
publicvoidclear()說明:清空內存變量。例子:permission.clear();詳細用法見。
privatevoidclearResult()throwsSQLException說明:清空記錄集,為私有方法,供內部調用。例子:clearResult();
publicvoidclose()throwsSQLException說明:關閉數據庫、聲明和連接。入口參數為空,返回空。例子:permission.close();詳細用法見。
publicintencode(boolean[]permBool)說明:將布爾型權限類型數組轉換為權限編碼,入口參數為布爾型權限類型數組,返回權限編碼。例子:permission.encode(permBool);詳細用法見。
publicboolean[]decode(intrigh_code)說明:將權限編碼轉換為布爾型權限類型數組,入口參數為權限編碼,返回布爾型權限類型數組。例子:permission.decode(-225);詳細用法見。
publicboolean[]strToArr(StringpermStr)說明:將權限說明轉換為布爾型權限類型數組,入口參數是權限說明,返回值為布爾型權限類型數組。例子:permission.strToArr("cp");詳細用法見。
publicStringarrToStr(boolean[]permBool)說明:將布爾型權限類型數組轉換為權限說明,入口參數為布爾型權限類型數組,返回權限說明。例子:permission.arrToStr(permBool);詳細用法見。
publicintstrToCode(StringpermStr)說明:將權限說明轉換為權限編碼,入口參數是權限說明,返回權限編碼。例子:permission.strToCode("ms");詳細用法見。
publicStringcodeToStr(intrigh_code)說明:將權限編碼解碼為權限說明,入口參數為權限編碼,返回值為權限說明。例子:permission.codeToStr(-129);詳細用法見。
publicvoidgetPerm(intgid)throwsSQLException說明:根據組號從數據庫中查出其全部權限,存入一個二維權限數組里,并封裝在對象里。入口參數為組號,返回值為空。例子:permission.getPerm(1);詳細用法見。
publicbooleanestPerm(intchan_cone_id,intchan_ctwo_id,StringpermStr)說明:根據一、二級欄目的編號,從封裝的二位權限數組里查出其編碼值,然后判斷傳入的權限說明是否符合條件。入口參數為一級欄目編號、二級欄目編號、權限說明,返回判斷是否為真的布爾值。例子:permission.estPerm(1,2,"bi");詳細用法見。3.程序流程:(01).查詢數據庫并取得記錄集〔方法一〕(02).指針移動到下一個記錄〔方法二〕(03).取字段值〔方法三〕(04).關閉數據庫、聲明和記錄集〔方法四〕(05).編碼功能,將01010101格式編成125〔方法五〕(06).解碼功能,將格式125解成01010101〔方法六〕(07).將字符串分解存入權限數組〔方法七〕(08).將權限數組轉換為字符串〔方法八〕(19).輸入一個權限字符串,返回一個編碼〔方法九〕(10).輸入一個編碼,返回一個權限字符串〔方法十〕(11).根據組ID查詢取得當前用戶的權限。存入一個二維數組〔方法十一〕(12).根據當前位置指針,及所需權限,從二維數組中判斷權限是否為真〔方法十二〕
4.權限說明約定:
系統權限權限說明權限編碼二進制權限類型數組瀏覽b12810000000permBool[0]添加i6401000000permBool[1]修改m3200100000permBool[2]屏蔽s1600010000permBool[3]刪除d800001000permBool[4]審核a400000100permBool[5]作廢c200000010permBool[6]打印p100000001permBool[7]
5.文件列表:Java源代碼.htm本權限類組件源代碼。
說明文檔.htm本文件,類的詳細說明、接口和思想。
/使用例如/存放怎樣使用本類的jsp例子程序。
/使用例如演示怎樣使用getRs()、next()、getString()、clear()、close()方法存取、移動指針、關閉數據庫的例子。
/使用例如演示怎樣使用encode()方法編碼的例子。
/使用例如演示怎樣使用decode()方法解碼的例子。
/使用例如/str演示怎樣使用strToArr()方法將權限說明轉換為權限類型數組的例子。
/使用例如演示怎樣使用arrToStr()方法將權限類型數組轉換為權限說明的例子。
/使用例如演示怎樣使用strToCode()方法將權限說明轉換為權限編碼的例子。
/使用例如演示怎樣使用codeToStr()方法將權限編碼轉換為權限說明的例子。
/使用例如演示怎樣使用getPerm()方法取出所有權限并訪問其任意欄目權限的例子。
/使用例如演示怎樣使用estPerm()方法判斷其任意欄目是否具有權限的例子。
6.數據庫表:
權限表〔righ〕:表中文名稱字段名稱數據類型數據寬度字段說明用戶組IDgrou_idint20N權限IDrigh_idint25NAP一級欄目IDchan_cone_idtinyint2N二級欄目IDchan_ctwo_idtinyint2N權限編碼righ_codeint8N
一級欄目表〔chan_cone〕:表中文名稱字段名稱數據類型數據寬度字段說明一級欄目代碼chan_cone_idtinyint2NP一級欄目名稱chan_cone_namevarchar15N
二級欄目表〔chan_ctwo〕:表q中文名稱字段名稱數據類型數據寬度字段說明一級欄目代碼chan_cone_idtinyint2N二級欄目代碼chan_ctwo_idtinyint2NP二級欄目名稱chan_ctwo_namevarchar15N4.2系統實現由于本系統完善度較高,貼近現實使用,故代碼量龐大,無法一一列舉說明,以下僅列舉特定功能進行說明。權限類實現////////////////////////////////////////////////////////////////////文件//描述:權限設置組件。//版本//////////////////////////////////////////////////////////////////
//定義組件權限包。packagecom.perm;
//導入標準Sql包。importjava.sql.*;importjavax.sql.*;
//導入Resin內置的Sql類,以便使用數據庫連接池。importcom.caucho.sql.DBPool;
//=======================================//類名:permission//描述:權限設置類。
//=======================================publicclasspermission{/*循環類變量*///定義for循環變量i、j。privateinti,j;
/*數組類變量*///定義權限賦值數組。privatechar[]permChar;//定義權限類型數組。publicboolean[]permBool;publicboolean[]permBoolCompare;//定義權限數組,創立權限數組對象。publicint[][]permInt=newint[5][20];
/*權限說明類變量*///定義權限說明字符串。publicStringpermStr;
/*編碼參數類變量*///定義編碼參數。privateintcodePar;
/*信息類變量*///定義判斷信息。privatebooleanestMess;
/*數據庫字段類變量*///定義欄目一的序號。privateintchan_cone_id;//定義欄目二的序號。privateintchan_ctwo_id;//定義權限編碼。privateintrigh_code;
/*JDBC連接類變量*///定義連接型變量conn以創立連接。privateConnectionconn;//定義JDBC聲明。privateStatementstmt;//定義記錄集型變量rs。privateResultSetrs;//定義sql語句。privateStringsql;
////方法名:permission//參數:無。//返回:無。//功能描述:構造方法,在創立對象時執行初始化工作。//創立:08/21/01//修改:08/25/01//
publicpermission(){/*數組類變量初始化*///創立權限類型數組對象。permBool=newboolean[8];permBoolCompare=newboolean[8];
/*權限說明類變量初始化*///給權限說明字符串賦值。permStr="";
/*信息類變量初始化*///給返回信息賦值。estMess=true;}
////方法名:getRs//參數:sql輸入sql語句。//返回:空。//功能描述:通過Resin內置連接池訪問數據庫并取得記錄集。//創立:08/21/01//修改:09/12/01//publicResultSetgetRs(Stringsql)throwsSQLException{try{//創立連接。conn=DBPool.getPool("Database").getConnection();//創立聲明。stmt=conn.createStatement();//取得記錄集。rs=stmt.executeQuery(sql);}catch(Exceptione){//拋出異常。System.err.println(e);}
//返回記錄集。returnrs;}
////方法名:next//參數:空。//返回:空。//功能描述:指針移動到下一個記錄。//創立:08/21/01//修改:09/12/01//publicbooleannext()throwsSQLException{try{//檢測記錄集是否為空。if(rs==null)thrownewSQLException("記錄集為空.");}catch(Exceptione){//拋出異常。System.err.println(e);}
//移動指針并返回。returnrs.next();}
////方法名:getString//參數:str字段名。//返回:str記錄中的值。//功能描述:從記錄中取值。//創立:08/21/01//修改:09/12/01//publicStringgetString(Stringstr)throwsSQLException{//取值并返回。returnrs.getString(str);}
////方法名:clear//參數:空//返回:空//功能描述:去除所有變量//創立:09/12/01//修改:09/15/01//publicvoidclear(){try{//清空循環變量。i=0;j=0;
//清空數組。permChar=null;permBool=null;permBoolCompare=null;permInt=null;
//清空字符串變量。permStr=null;sql=null;
//清空布爾型變量。estMess=false;
//清空整型變量。codePar=0;chan_cone_id=0;chan_ctwo_id=0;righ_code=0;}catch(Exceptione){//拋出異常。System.err.println(e);}}
////方法名:clearResult//參數:空。//返回:空。//功能描述:去除記錄集和聲明。//創立:09/12/01//privatevoidclearResult()throwsSQLException{try{//關閉記錄集。if(rs!=null)rs.close();//清空記錄集變量。rs=null;
//關閉聲明。if(stmt!=null)stmt.close();//清空聲明變量。stmt=null;}catch(Exceptione){//拋出異常。System.err.println(e);}}
////方法名:close//參數:空。//返回:空。//功能描述:去除rs和stmt并關閉數據庫//創立:08/21/01//修改:09/12/01//publicvoidclose()throwsSQLException{try{//清空記錄集。clearResult();
//檢查連接變量是否清空。if(conn==null)thrownewSQLException("當前連接為空.");
//預防反復關閉連接。if(conn.isClosed())thrownewSQLException("連接已經關閉.");
//執行關閉連接。conn.close();//清空連接變量。conn=null;}catch(Exceptione){//拋出異常。System.err.println(e);}}
////方法名:encode//參數:permBool布爾型權限類型數組。//返回:righ_code加密后的權限編碼。//功能描述:將布爾型權限類型數組進行編碼后加密,得到一個權限編碼。//創立:08/21/01//修改:08/25/01//publicintencode(boolean[]permBool){try{righ_code=0;codePar=128;for(i=0;i<8;i++){//進行權限編碼。righ_code=permBool[i]==true?righ_code|codePar:righ_code;//改變編碼參數。codePar=codePar>>1;}}catch(Exceptione){//拋出異常。System.err.println(e);}//返回權限編碼。returnrigh_code;}
////方法名:decode//參數:righ_code權限編碼。//返回:permBool布爾型權限類型數組。//功能描述:將權限編碼進行解密后解碼,得到一個布爾型權限類型數組。//創立:08/21/01//修改:08/25/01//publicboolean[]decode(intrigh_code){try{codePar=128;
for(i=0;i<8;i++){//采用位運算的方法將解密后的權限編碼解碼。permBoolCompare[i]=((righ_code&codePar)==codePar)?true:false;//位移。codePar=codePar>>1;}}catch(Exceptione){//拋出異常。System.err.println(e);}//返回解碼后的權限類型數組。returnpermBoolCompare;}
////方法名:strToArr//參數:permStr權限說明。//返回:permBool布爾型權限類型數組。//功能描述:把權限說明轉換為布爾型權限類型數組。//創立:08/21/01//修改:08/25/01//publicboolean[]strToArr(StringpermStr){char[]permChar={'b','i','m','s','d','a','c','p'};
try{//將權限說明轉換為權限類型數組,并記錄信息。for(i=0;i<8;i++){permBool[i]=permStr.indexOf(permChar[i])!=-1?true:false;}}catch(Exceptione){//拋出異常。System.err.println(e);}//返回權限類型數組。returnpermBool;}
////方法名:arrToStr//參數:permBool布爾型權限類型數組。//返回:permStr權限說明。//功能描述:把布爾型權限類型數組轉換為權限說明。//創立:08/21/01//修改:08/25/01//publicStringarrToStr(boolean[]permBool){char[]permChar={'b','i','m','s','d','a','c','p'};
try{//將權限說明轉換為權限類型數組,并記錄信息。for(i=0;i<8;i++){permStr=permBool[i]==true?permStr+permChar[i]:permStr;}}catch(Exceptione){//拋出異常。System.err.println(e);}//返回權限說明字符串。returnpermStr;}
////方法名:strToCode//參數:permStr權限說明字符串。//返回:righ_code加密后的權限編碼。//功能描述:將權限說明字符串進行編碼后加密,得到一個權限編碼。//創立:08/21/01//修改:08/25/01//publicintstrToCode(StringpermStr){try{righ_code=encode(strToArr(permStr));}catch(Exceptione){//拋出異常。System.err.println(e);}//返回權限編碼。returnrigh_code;}
////方法名:codeToStr//參數:righ_code權限編碼。//返回:permStr權限說明字符串。//功能描述:將權限編碼進行解密后解碼,得到一個權限說明字符串。//創立:08/21/01//修改:08/25/01//publicStringcodeToStr(intrigh_code){try{permStr=arrToStr(decode(righ_code));}catch(Exceptione){//拋出異常。System.err.println(e);}//返回權限說明字符串。returnpermStr;}
////方法名:getPerm//參數:gid組ID號。//返回:空。//功能描述:根據組ID號訪問數據庫,取出其所有權限,并存到一個二維權限數組里。//創立:08/21/01//修改:08/25/01//publicvoidgetPerm(intgid)throwsSQLException{try{//編寫sql語句。sql="selectchan_cone_id,chan_ctwo_id,righ_codefromrighwheregrou_id="+gid;//連接數據庫,取得記錄集。getRs(sql);while(rs.next()){//取出欄目一的值并轉換為整型。chan_cone_id=java.lang.Integer.parseInt(rs.getString("chan_cone_id"));//取出欄目二的值并轉換為整型。chan_ctwo_id=java.lang.Integer.parseInt(rs.getString("chan_ctwo_id"));//取出權限編碼的值并轉換為整型。righ_code=java.lang.Integer.parseInt(rs.getString("righ_code"));//根據欄目一和欄目二的值定義當前權限數組位置,寫入權限編碼。permInt[(chan_cone_id-1)][(chan_ctwo_id-1)]=righ_code;}//執行close()方法關閉數據庫。close();}catch(Exceptione){//拋出異常。System.err.println(e);}}
////方法名:estPerm//參數:chan_cone_id,chan_ctwo_id,permStr子系統編號、欄目編號和權限說明。//返回:estMess布爾型判斷信息。//功能描述:將權限編碼righ_code和權限說明都轉換為權限類型數組,將兩者作比擬,并返回判斷信息。//創立:08/21/01//修改:08/26/01//publicbooleanestPerm(intchan_cone_id,intchan_ctwo_id,StringpermStr){//boolean[]permBoolCompare=newboolean[8];
try{//將權限編碼righ_code轉換為權限類型數組。permBoolCompare=decode(permInt[chan_cone_id-1][chan_ctwo_id-1]);//將權限說明轉換為權限類型數組。permBool=strToArr(permStr);//重置j作為計數器。j=0;//逐個比擬兩者權限,如果兩個權限類型數組為真并且相等,計數器加1。for(i=0;i<8;i++)j=(permBool[i]==permBoolCompare[i])&&(permBool[i]==true)?++j:j;//如果計數器的值和要求的權限說明個數相等,證明符合其要求。estMess=j==permStr.length()?true:false;}catch(Exceptione){//拋出異常。System.err.println(e);}//返回比擬結果。returnestMess;}}
4.2.2用戶列表實現用戶列表功能是用于測試通用權限的。列表界面如下:publicArrayList<UserForm>query(intcurPage){ setCurPage(curPage); StringBuildersql=newStringBuilder("SELECTuidFROMUsers"); ArrayList<UserForm>list=newArrayList<UserForm>(); Connectioncon=null; try{ con=ConnectionManager.getConnection(); Statementstmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSetrs=stmt.executeQuery(sql.toString()); //總頁數 rs.last(); setTotalRow(rs.getRow()); //定位到第一條〔從0開始〕 intbeginIndex=(cur1)*getPerPage(); rs.absolute(beginIndex); //取這一頁的數據 while(list.size()<this.getPerPage()&&rs.next()){ UserFormform=newUserForm(); form.setUid(rs.getString("uid")); list.add(form); } //釋放內存 rs.close(); stmt.close(); }catch(SQLExceptione){ this.message=e.getMessage(); }finally{ try{ if(con!=null) con.close(); }catch(SQLExceptione){ } } returnlist;}4.2.3用戶權限實現首先將所有權限顯示在頁面上,管理員針對某用戶選擇其權限。圖為了顯示所有權限,并同時顯示用戶已有的權限,編寫函數實現,代碼如下:CREATEFUNCTION[dbo].[GetUserQX]( @uidnvarchar(10))RETURNSTABLEASRETURN( FROMdbo.quanxian LEFTOUTERJOIN( select*fromdbo.userqxwhereuid=@uid )uqx)界面顯示采用struts框架中的HTML標簽實現:<html:formaction="/User"><html:hiddenproperty="UserAction"value="addqx"/><html:hiddenproperty="uid"/><div>用戶:<bean:writename="userForm"property="uid"/></div> <tablecellspacing="0"cellpadding="0"> <logic:presentname="QXList"> <logic:iterateid="qx"name="QXList"> <tr> <tdheight="25"align="right"class="tdListFontSize"> <logic:equalname="qx"property="enabled"value="true"> <inputtype="checkbox"name="id"value="${pageScope.qx.id}"checked/> </logic:equal><logic:equalname="qx"property="enabled"value="false"> <inputtype="checkbox"name="id"value="${pageScope.qx.id}"/> </logic:equal> </td> <tdheight="25"align="left"class="tdListFontSize"> <bean:writename="qx"property="name"/> </td> </tr> </logic:iterate> </logic:present> </table> <html:submit>保存</html:submit></html:form>5系統測試由于條件限制,系統未能經過大規模訪問及超大容量數據庫測試,僅進行過小范圍及叫囂數據庫測試。效勞器端:WindowsXPProSP2、Tomcat6、SQLSever2005開發版。客戶端:IE8根本測試:用于測試系統根本功能的實現情況和系統是否存在設計錯誤。根本測試過程:使用管理員戶進行登錄,修改密碼,修改系統功能,添加教師用戶,修改學生、教師、選題等信息審核題目,查閱打印選題情況列表,增加新管理員,修改所有用戶信息。注冊學生用戶,使用學生用戶登錄,修改個人信息及密碼,查閱選題情況及教師信息,選報題目,退選題目。使用教師用戶登錄,修改個人信息及密碼,提交題目,查看題目狀態及選報學生信息。目標是分別使用不同用戶登錄,進行按規定程序操作,嘗試各個功能,檢測功能實現情況,檢測頁面生成情況及數據庫連接情況。并發性測試:用于測試系統在多用戶同時訪問情況下對沖突的處理情況。并發性測試過程:同時使用多個用戶登錄,包括管理員、教師、及多個學生用戶,使用軟件同時提交表單,嘗試不同學生同時選報同一題目,不同教師同時對同一題目進行操作,不同管理員同時對同一用戶進行資料修改等。進行按規定程序操作,嘗試各個功能,檢測系統對并發性事件的處理能力。容錯性測試:用戶測試系統對錯誤信息的處理情況及對非法請求的控制情況。容錯性測試過程:在同一臺計算機上登錄不同權限用戶訪問同一頁面,直接輸入url請求非法頁面,檢測顯示情況。使用不同用戶登錄,嘗試各種不正常操作,嘗試進行越權操作,檢測系統對非法操作的控制能力。5.3測試結果根本測試,用戶功能全部實現,完全滿足用戶要求。并發性測試,多用戶同時登錄時未出現不正常狀態,效勞器對不同用戶請求進行分布處理。容錯性測試,系統對非法請求進行限制,對非法操作進行正確提示,限制非法用戶訪問頁面。6軟件開發中主要解決的問題在本系統的構思過程中,我主要考慮了2個問題,一是平安方面的,另一個是軟件工程方面的。數據庫的平安性是指保護數據庫以防止不合法的使用所造成的數據泄露、更改或破壞。系統平安保護措施是否有效是數據庫系統的主要指標之一。它的平安是很重要的。數據庫數據量龐大、用戶訪問頻繁,有些數據具有保密性,因此數據庫要由數據庫管理系統進行科學的組織和管理,以確保數據庫的平安性和完整性。[7]對于數據庫管理來說,保護數據不受內部和外部侵害是一項重要的工作。MicrosoftSQLServer正日益廣泛的使用于各部門內外,作為SQLServer的數據庫系統管理員,需要深入的理解SQLServer的平安性控制策略,以實現管理平安性的目標。各層SQLServer平安控制策略是通過各層平安控制系統的身份驗證實現的。身份驗證是指當用戶訪問系統時,系統對該用戶的賬號和口令確實認過程。身份驗證的內容包括確認用戶的賬號是否有效、能否訪問系統、能訪問系統的哪些數據等。訪問系統用戶能否訪問SQLServer系統就取決于SQLServer系統身份驗證方式的設置。下面介紹用戶標識與驗證:用戶標示和驗證是系統提供的最外層平安保護措施。其方法是由系統提供一定的方式讓用戶標示自己的名字或身份。每次用戶要求進入系統時,由系統進行核對,通過鑒定后才提供機器使用權。對于獲得上機權的用戶假設要使用數據庫時數據庫管理系統還要進行用戶標識和鑒定。用戶標識和鑒定的方法有很多種,而且在一個系統中往往是多種方法并舉,以獲得更強的平安性。常用的方法有:用一個用戶名或者用戶標識號來標明用戶身份。系統內部記錄著所有合法用戶的標識,系統驗證此戶是否合法用戶,假設是,那么可以進入下一步的核實;假設不是,那么不能使用系統。為了進一步核實用戶,系統常常要求用戶輸入口令〔Password〕。為保密起見,用戶在終端上輸入的口令不顯示在屏幕上。系統核對口令以驗證用戶身份。用戶標識與驗證在SQLServer中對應的是WindowsNT/2000登錄賬號和口令以及SQLServ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 英語語法試題及答案
- 儲備工廠面試題及答案
- 色牢度桑蠶絲標準
- 2025年食品冷鏈物流溫控技術對冷鏈物流行業發展趨勢研究報告
- 孔院教師入職培訓
- 2025年VXI總線各類卡式儀器項目申請報告模板
- 高中物理45感生電動勢和動生電動勢教案
- 鄉村旅游接待設施2025年設計理念與市場需求分析報告
- 2025年文化旅游演藝項目跨界營銷與品牌影響力拓展報告
- 廣西壯族自治區賀州市昭平縣2025屆年中考三模道德與法治試卷(含答案)
- 2025年畜禽預混料項目可行性研究報告
- 石材開采施工方案
- DB37T 5170-2020 動能回彈法檢測混凝土抗壓強度技術規程
- 二氧化碳潴留的臨床護理
- CMOS數字集成電路知到智慧樹章節測試課后答案2024年秋寧波大學
- 《冰川地貌》課件
- 2024年10月自考00882學前教育心理學試題及答案含評分參考
- 廣東省廣州市2024年中考道德與法治試卷(含答案)
- 2024-2030年中國orc發電行業發展狀況規劃研究報告版
- 新教材教科版2022-2023學年度第二學期五年級科學下冊期末測試卷及答案(含三套題)
- 2024年可行性研究報告投資估算及財務分析全套計算表格(含附表-帶只更改標紅部分-操作簡單)
評論
0/150
提交評論