孫云杰 段祎林 田盼棟 趙雪玲
(西安石油大學理學院 陜西省西安市 710300)
隨著互聯網技術的不斷發展,登錄界面的功能給開發者提出了更高的要求, 登錄界面具有在控制用戶權限、記錄用戶行為的同時,保護操作安全的作用,所以它是必須提供賬戶和密碼的界面。開發者和用戶看到的登錄界面是不同的“景向”,用戶要求的登錄界面是:便捷、美觀和實用;而開發者既要考慮登錄功能的認證和授權,又要保障操作的安全性,還要簡化實現功能的繁瑣代碼等一系列問題。
在實現多角色多用戶登錄的教學系統設計中,必須要通過如下的措施來保障系統的正常運行。
(1)多角色用戶認證,登錄功能需要根據用戶的角色授予相應的權限,因此在教學系統中設定三種用戶角色:學生、教師和管理員;
(2)預防Web 的惡意攻擊,就需要在登錄時,做好Web 免受攻擊的防御措施,Web 常見的攻擊手段:惡意腳本發起攻擊(XSS)、借助cookie 偽造認證發送請求攻擊(CSRF)、用SQL 語句偽造參數發出攻擊、大量請求指令使服務器崩潰(DDoS)等等;
(3)考慮用戶停留頁面無任何操作或者關閉頁面一段時間后,避免在信息泄露引起不必要的紛爭等情況;
(4)要限制單用戶同時在不同的設備上運行;
(5)確保用戶密碼的安全,在密碼的傳輸和存儲中都需要以密文的形式進行,加密方式應當采用不可逆的Нash 算法,如:MD5 算法、SНA 系列算法等;
(6)為了防止黑客使用暴力破解方式進行登錄嘗試,在登錄時需要添加驗證碼進行驗證。
完美的教學系統設計離不開技術的支持,該系統中所設計的技術有:
(1)Bootstrap 是最受歡迎的НTML、CSS 和JS 框架之一,所以采用Bootstrap 作為主要的前端框架進行頁面編寫,用于開發響應式布局、移動設備優先的WEB 項目。
(2)SSM框架是Spring、SpringMVC 和MyBatis框架的組合,是Java 領域采用標準的MVC 模式構成的開源Web 框架,是以Spring 為核心的分層架構,它的出現能解決Web 系統中規模龐大的應用、復雜度不斷提升的問題[1]。
Spring 利用控制反轉(IoC)技術促進了低耦合,在系統運行中IoC 能動態地向某個對象提供它所需要的其他對象;而面向切面編程(AOP)則是用來提升內聚,可以方便地實現對程序進行權限攔截、運行監控等功能[2]。
SpringMVC 是Spring 提供的一個強大而靈活的Web 框架,借助于普通Java 對象(POJO) 的開發模式,使用注解的方式進行開發,能夠讓開發者直觀明了地進行設計和學習,從而簡化控制器的開發和測試[3]。

圖1:登錄功能的數據庫結構圖
MyBatis 是持久層框架,它的核心技術是對象關系映射(ORM),實現了Java 數據庫連接(JDBC)的封裝,可以使用簡單的xml 文件配置或注解,做到接口和Java 的POJO 與數據庫中數據表的記錄相映射,使得編程人員可以使用面向對象的編程思想來操作數據庫,將數據庫層完全隱蔽[1]。
(3)Spring Security 是基于Spring 的企業應用系統,能提供聲明式的訪問控制的安全框架,其中有一組可以在Spring 應用上下文中配置的Bean 及相關的配置文檔,借助于IOC,DI (依賴注入)和AOP 功能將用戶身份認證進行統一的管理,從而實現對資源訪問的綜合管控與維護[4]。
數據庫是登錄界面的靈魂,是它把重要技術和核心要素有機的結合在一起。登錄功能的數據庫里有兩個實體表:用戶表和角色表,用戶和角色多對多的關系,中間表是用戶和角色的紐帶。其中,用戶表中密碼存儲的是經過加密后的密碼,如圖1 所示。
登錄功能的開發離不開如下五個模塊:common 公用工具類; entity 實體類; login 登錄功能模塊(程序入口); mapper 映射器類; service 服務類。模塊之間的依賴關系(如圖2 所示)是: login 模塊依賴common、entity、service 模塊; service 模塊依賴entity、mapper 模塊; mapper 模塊依賴entity 模塊。
4.2.1 common 模塊
common 模塊封裝公用的工具類,其中包含三個類:ApiResponse(通用的API 接口封裝)、BaseException(異常基類)和SecurityException(全局異常);一個接口:IStatus(狀態碼接口);兩個枚舉:Roles(用戶角色枚舉)、Status(通用狀態碼)。Roles枚舉中定義了三個用戶角色:學生(Student)、教師(Teacher)、管理員(Administrator),分別與數據庫role 表中的角色對應。其中,“ROLE_”是Spring Security 角色權限的特定前綴。

圖2:模塊依賴總覽圖
4.2.2 entity 模塊
entity 模塊封裝實體類,其中包含兩個實體類:User(用戶)、Role(角色),這個模塊在項目中引入了lombok,是為了在編譯時自動為實體類的屬性生成構造器、getter/setter、equals、hashcode、toString 方法,在編譯生成的字節碼文件中會自動生成getter 和setter 方法。
4.2.3 mapper 模塊
mapper 模塊封裝映射器,任持久層的角色,其中包含兩個映射器接口:UserMapper、RoleMapper,兩個配置文件UserMapper.xml、RoleMapper.xml。mapper 是MyBatis 集成在項目中的核心內容,為service 層提供調用方法,實現java 對數據庫的增、刪、改、查操作。
4.2.4 service 模塊
service 模塊封裝服務類, 是業務層的角色,其中包含一個服務類:UserDetailsService,實現了Spring Security 的核心接口,主要用于加載用戶特定的數據。
4.2.5 login 模塊
login 模塊為程序的入口,主要實現用戶的登錄認證、授權功能,其中包含四個package:config(配置類,包括SecurityConfig核心配置)、cotroller(前端控制器,包括LoginController 登錄控制器、CaptchaController 驗證碼生成器)、filter(過濾器,包括CaptchaVerifyFilter 驗證碼驗證過濾器)、handle(處理器,包括CustomizedAuthenticationSuccessНandler 認證成功處理器、Custom izedAuthenticationFailureНandler 認證失敗處理器),和啟動類:LoginApplication。
系統登錄控制器LoginController 的核心代碼如下(由于篇幅有限,其它模塊的代碼不再詳述):


Spring Security 的核心配置類:SecurityConfig,在其核心代碼中配置了CaptchaVerifyFilter 驗證碼驗證過濾器,設置X-Frame-Options 為SAMEORIGIN,CustomizedAuthenticationSuccess Нandler 認證成功處理器,而CustomizedAuthenticationFailureНand ler 是認證失敗處理器,期間開啟csrf 攻擊的防御功能,登錄和注銷的基礎配置,使訪問路徑的訪問權限合法化,session 管理器,BCryptPasswordEncoder 加密方法。

圖3:登錄頁面

圖4:登錄驗證碼驗證界面
Spring Security 中的BCryptPasswordEncoder 方法,采用SНA-256+隨機鹽+密鑰對密碼進行加密,SНA 系列是Нash 算法,其過程是不可逆的,主要是為了加強密碼保存的安全性而設計的。
利用上面所講述的方法完成的教學系統登錄界面如圖3、圖4所示。
登錄功能在視覺上的美觀、便捷的操作以及用戶信息的安全,是一個網站的剛性需求。
網站的入口、門面是網站的第一道防線,安全的重要性不言而喻,集成了Spring Security 為登錄功能的開發手段,給使用者提供了極大的便利及安全保障。登錄功能看似簡單,但深究其背后的設計與開發,可以引申出諸多問題需要我們不斷完善與充實。