孫云杰 段祎林 田盼棟 趙雪玲
(西安石油大學(xué)理學(xué)院 陜西省西安市 710300)
隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,登錄界面的功能給開發(fā)者提出了更高的要求, 登錄界面具有在控制用戶權(quán)限、記錄用戶行為的同時(shí),保護(hù)操作安全的作用,所以它是必須提供賬戶和密碼的界面。開發(fā)者和用戶看到的登錄界面是不同的“景向”,用戶要求的登錄界面是:便捷、美觀和實(shí)用;而開發(fā)者既要考慮登錄功能的認(rèn)證和授權(quán),又要保障操作的安全性,還要簡化實(shí)現(xiàn)功能的繁瑣代碼等一系列問題。
在實(shí)現(xiàn)多角色多用戶登錄的教學(xué)系統(tǒng)設(shè)計(jì)中,必須要通過如下的措施來保障系統(tǒng)的正常運(yùn)行。
(1)多角色用戶認(rèn)證,登錄功能需要根據(jù)用戶的角色授予相應(yīng)的權(quán)限,因此在教學(xué)系統(tǒng)中設(shè)定三種用戶角色:學(xué)生、教師和管理員;
(2)預(yù)防Web 的惡意攻擊,就需要在登錄時(shí),做好Web 免受攻擊的防御措施,Web 常見的攻擊手段:惡意腳本發(fā)起攻擊(XSS)、借助cookie 偽造認(rèn)證發(fā)送請(qǐng)求攻擊(CSRF)、用SQL 語句偽造參數(shù)發(fā)出攻擊、大量請(qǐng)求指令使服務(wù)器崩潰(DDoS)等等;
(3)考慮用戶停留頁面無任何操作或者關(guān)閉頁面一段時(shí)間后,避免在信息泄露引起不必要的紛爭(zhēng)等情況;
(4)要限制單用戶同時(shí)在不同的設(shè)備上運(yùn)行;
(5)確保用戶密碼的安全,在密碼的傳輸和存儲(chǔ)中都需要以密文的形式進(jìn)行,加密方式應(yīng)當(dāng)采用不可逆的Нash 算法,如:MD5 算法、SНA 系列算法等;
(6)為了防止黑客使用暴力破解方式進(jìn)行登錄嘗試,在登錄時(shí)需要添加驗(yàn)證碼進(jìn)行驗(yàn)證。
完美的教學(xué)系統(tǒng)設(shè)計(jì)離不開技術(shù)的支持,該系統(tǒng)中所設(shè)計(jì)的技術(shù)有:
(1)Bootstrap 是最受歡迎的НTML、CSS 和JS 框架之一,所以采用Bootstrap 作為主要的前端框架進(jìn)行頁面編寫,用于開發(fā)響應(yīng)式布局、移動(dòng)設(shè)備優(yōu)先的WEB 項(xiàng)目。
(2)SSM框架是Spring、SpringMVC 和MyBatis框架的組合,是Java 領(lǐng)域采用標(biāo)準(zhǔn)的MVC 模式構(gòu)成的開源Web 框架,是以Spring 為核心的分層架構(gòu),它的出現(xiàn)能解決Web 系統(tǒng)中規(guī)模龐大的應(yīng)用、復(fù)雜度不斷提升的問題[1]。
Spring 利用控制反轉(zhuǎn)(IoC)技術(shù)促進(jìn)了低耦合,在系統(tǒng)運(yùn)行中IoC 能動(dòng)態(tài)地向某個(gè)對(duì)象提供它所需要的其他對(duì)象;而面向切面編程(AOP)則是用來提升內(nèi)聚,可以方便地實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截、運(yùn)行監(jiān)控等功能[2]。
SpringMVC 是Spring 提供的一個(gè)強(qiáng)大而靈活的Web 框架,借助于普通Java 對(duì)象(POJO) 的開發(fā)模式,使用注解的方式進(jìn)行開發(fā),能夠讓開發(fā)者直觀明了地進(jìn)行設(shè)計(jì)和學(xué)習(xí),從而簡化控制器的開發(fā)和測(cè)試[3]。
圖1:登錄功能的數(shù)據(jù)庫結(jié)構(gòu)圖
MyBatis 是持久層框架,它的核心技術(shù)是對(duì)象關(guān)系映射(ORM),實(shí)現(xiàn)了Java 數(shù)據(jù)庫連接(JDBC)的封裝,可以使用簡單的xml 文件配置或注解,做到接口和Java 的POJO 與數(shù)據(jù)庫中數(shù)據(jù)表的記錄相映射,使得編程人員可以使用面向?qū)ο蟮木幊趟枷雭聿僮鲾?shù)據(jù)庫,將數(shù)據(jù)庫層完全隱蔽[1]。
(3)Spring Security 是基于Spring 的企業(yè)應(yīng)用系統(tǒng),能提供聲明式的訪問控制的安全框架,其中有一組可以在Spring 應(yīng)用上下文中配置的Bean 及相關(guān)的配置文檔,借助于IOC,DI (依賴注入)和AOP 功能將用戶身份認(rèn)證進(jìn)行統(tǒng)一的管理,從而實(shí)現(xiàn)對(duì)資源訪問的綜合管控與維護(hù)[4]。
數(shù)據(jù)庫是登錄界面的靈魂,是它把重要技術(shù)和核心要素有機(jī)的結(jié)合在一起。登錄功能的數(shù)據(jù)庫里有兩個(gè)實(shí)體表:用戶表和角色表,用戶和角色多對(duì)多的關(guān)系,中間表是用戶和角色的紐帶。其中,用戶表中密碼存儲(chǔ)的是經(jīng)過加密后的密碼,如圖1 所示。
登錄功能的開發(fā)離不開如下五個(gè)模塊:common 公用工具類; entity 實(shí)體類; login 登錄功能模塊(程序入口); mapper 映射器類; service 服務(wù)類。模塊之間的依賴關(guān)系(如圖2 所示)是: login 模塊依賴common、entity、service 模塊; service 模塊依賴entity、mapper 模塊; mapper 模塊依賴entity 模塊。
4.2.1 common 模塊
common 模塊封裝公用的工具類,其中包含三個(gè)類:ApiResponse(通用的API 接口封裝)、BaseException(異常基類)和SecurityException(全局異常);一個(gè)接口:IStatus(狀態(tài)碼接口);兩個(gè)枚舉:Roles(用戶角色枚舉)、Status(通用狀態(tài)碼)。Roles枚舉中定義了三個(gè)用戶角色:學(xué)生(Student)、教師(Teacher)、管理員(Administrator),分別與數(shù)據(jù)庫role 表中的角色對(duì)應(yīng)。其中,“ROLE_”是Spring Security 角色權(quán)限的特定前綴。
圖2:模塊依賴總覽圖
4.2.2 entity 模塊
entity 模塊封裝實(shí)體類,其中包含兩個(gè)實(shí)體類:User(用戶)、Role(角色),這個(gè)模塊在項(xiàng)目中引入了lombok,是為了在編譯時(shí)自動(dòng)為實(shí)體類的屬性生成構(gòu)造器、getter/setter、equals、hashcode、toString 方法,在編譯生成的字節(jié)碼文件中會(huì)自動(dòng)生成getter 和setter 方法。
4.2.3 mapper 模塊
mapper 模塊封裝映射器,任持久層的角色,其中包含兩個(gè)映射器接口:UserMapper、RoleMapper,兩個(gè)配置文件UserMapper.xml、RoleMapper.xml。mapper 是MyBatis 集成在項(xiàng)目中的核心內(nèi)容,為service 層提供調(diào)用方法,實(shí)現(xiàn)java 對(duì)數(shù)據(jù)庫的增、刪、改、查操作。
4.2.4 service 模塊
service 模塊封裝服務(wù)類, 是業(yè)務(wù)層的角色,其中包含一個(gè)服務(wù)類:UserDetailsService,實(shí)現(xiàn)了Spring Security 的核心接口,主要用于加載用戶特定的數(shù)據(jù)。
4.2.5 login 模塊
login 模塊為程序的入口,主要實(shí)現(xiàn)用戶的登錄認(rèn)證、授權(quán)功能,其中包含四個(gè)package:config(配置類,包括SecurityConfig核心配置)、cotroller(前端控制器,包括LoginController 登錄控制器、CaptchaController 驗(yàn)證碼生成器)、filter(過濾器,包括CaptchaVerifyFilter 驗(yàn)證碼驗(yàn)證過濾器)、handle(處理器,包括CustomizedAuthenticationSuccessНandler 認(rèn)證成功處理器、Custom izedAuthenticationFailureНandler 認(rèn)證失敗處理器),和啟動(dòng)類:LoginApplication。
系統(tǒng)登錄控制器LoginController 的核心代碼如下(由于篇幅有限,其它模塊的代碼不再詳述):
Spring Security 的核心配置類:SecurityConfig,在其核心代碼中配置了CaptchaVerifyFilter 驗(yàn)證碼驗(yàn)證過濾器,設(shè)置X-Frame-Options 為SAMEORIGIN,CustomizedAuthenticationSuccess Нandler 認(rèn)證成功處理器,而CustomizedAuthenticationFailureНand ler 是認(rèn)證失敗處理器,期間開啟csrf 攻擊的防御功能,登錄和注銷的基礎(chǔ)配置,使訪問路徑的訪問權(quán)限合法化,session 管理器,BCryptPasswordEncoder 加密方法。
圖3:登錄頁面
圖4:登錄驗(yàn)證碼驗(yàn)證界面
Spring Security 中的BCryptPasswordEncoder 方法,采用SНA-256+隨機(jī)鹽+密鑰對(duì)密碼進(jìn)行加密,SНA 系列是Нash 算法,其過程是不可逆的,主要是為了加強(qiáng)密碼保存的安全性而設(shè)計(jì)的。
利用上面所講述的方法完成的教學(xué)系統(tǒng)登錄界面如圖3、圖4所示。
登錄功能在視覺上的美觀、便捷的操作以及用戶信息的安全,是一個(gè)網(wǎng)站的剛性需求。
網(wǎng)站的入口、門面是網(wǎng)站的第一道防線,安全的重要性不言而喻,集成了Spring Security 為登錄功能的開發(fā)手段,給使用者提供了極大的便利及安全保障。登錄功能看似簡單,但深究其背后的設(shè)計(jì)與開發(fā),可以引申出諸多問題需要我們不斷完善與充實(shí)。