之前制作網站的時候使用了Apache Shiro進行登入驗證/權限認證,相比Spring Security,它更小巧,更容易上手,而且和Spring Boot的配合使用也完全不麻煩。
Shiro的四大功能
- Authentication:有時也簡稱為“登入”,這是一個證明使用者是他們所說的他們是誰的行為。
- Authorization:通路控制的過程,也就是絕對“誰”去通路“什麼”。
- Session Management:管理使用者特定的會話,即使在非 Web 或 EJB 應用程式。
- Cryptography:通過使用加密算法保持資料安全同時易于使用。
Shiro的架構的3個主要的概念
Subject,SecurityManager 和 Realms
我對這些的了解比較通俗。
Subject就是對象,比如登入的使用者。
Realms裡面應該定義登入/權限的邏輯,因為架構并不知道你的邏輯是怎麼樣的,是以往往需要重寫Realm方法。然後它負責對資料庫的一些操作,可以看作DAO層。
而SecurityManager相當于管理Realms的容器,它負責管理Reamls,以及各種内部元件。(隻是從這個方面看的話,感覺和分布式架構中的注冊中心zookeeper/eureka的作用類似。當然此外這兩者是完全不同的。)
ShiroConfiguration
因為我使用的是Spring boot,是以相比Spring配置更為簡便。而需要內建Shiro的話,需要單獨配置ShiroConfiguration。
步驟也很簡單,隻有三步:
- 配置Realms,可以配置一個/多個,也可以選擇重寫。我個人是重寫了授權和鑒權的過程。
- 調用SecurityManager注冊Realm,類似于将服務送出給注冊中心
- 配置過濾器
過濾器不需多說,要想避免直接通路網站的靜态資源必備,而且可以根據權限來決定可以通路的頁面。其配置方法有許多種,我個人采用的是比較簡單粗暴的鍊式過濾。就是使用了LinkedHashMap(這個是有序的哈希表),按照順序比對。比對成功則提供頁面,不成功則跳轉到指定頁面。
這是比較基本的用法。但是實際應用中,每次通路頁面都要進行一次鑒權會比較麻煩,是以我在ShiroConfiguration裡內建了Redis緩存,這裡便不詳細說明了。
其實Shiro作為一個企業級的架構,功能非常強大。在這裡登入和權限驗證算是一個比較基礎的功能,期待以後可以繼續發掘它以及一直想玩的Spring Security。