Shiro 框架
Shiro 是一個用于 Java 應用程序的安全框架。它提供了身份驗證、授權、加密和會話管理等功能,可以幫助開發人員構建安全可靠的應用程序。
Java 中針對權限管理常見的有 2 個著名的框架:spring security 和 shiro
shiro 基本概念
-
credentials 資格證書
-
Principal 當事人
-
Authentication 認證
-
Authorization 授權
Shiro 工作原理
Shiro 的工作原理主要包括身份驗證和授權兩個方面。
在身份驗證方面,Shiro 提供了一種簡單的方式來驗證用戶的身份。它可以通過用戶名和密碼、輕量目錄訪問協議 LDAP、OAuth 等多種方式進行身份驗證。當用戶提供身份憑證后,Shiro 會驗證憑證的有效性,并返回驗證結果。
在授權方面,Shiro 提供了一種靈活的授權機制。開發人員可以定義角色和權限,并將其與用戶關聯起來。當用戶嘗試進行某個操作時,Shiro 會根據用戶的角色和權限來判斷是否允許該操作。
Shiro 還提供了會話管理功能,可以跟蹤和管理用戶的會話狀態。它支持將會話信息存儲在內存、數據庫或其他存儲介質中,并提供了一些常見的會話管理操作,如創建、銷毀、過期等。
總的來說,Shiro 的工作原理是通過身份驗證來確認用戶的身份,并通過授權機制來管理用戶的角色和權限,從而確保應用程序的安全性和可靠性。
身份認證是判斷一個用戶是否為合法用戶的處理過程。最常用的簡單身份認證方式是系統通過核對用戶輸入的用戶名和口令,看其是否與系統中存儲的該用戶的用戶名和口令一致,來判斷用戶身份是否正確。對于采用指紋等系統,則出示指紋;對于硬件 Key 等刷卡系統,則需要刷卡。
授權就是訪問控制,控制誰能訪問哪些資源。主體進行身份認證后需要分配權限方可訪問系統的資源,對于某些資源沒有權限是無法訪問的
shiro 運行時異常
AuthenticationException 異常是 Shiro 在登錄認證過程中,認證失敗需要拋出的異常
CredentitalsException 憑證異常
IncorrectCredentialsException 不正確的憑證
ExpiredCredentialsException 憑證過期
AccountException 賬號異常
ConcurrentAccessException 并發訪問異常(多個用戶同時登錄時拋出)
UnknownAccountException 未知的賬號
ExcessiveAttemptsException 認證次數超過限制
DisabledAccountException 禁用的賬號
LockedAccountException 賬號被鎖定
pportedTokenException 使用了不支持的 Token
AuthorizationException 鑒權操作異常
UnauthorizedException: 拋出以指示請求的操作或對請求的資源的訪問是不允許的
UnanthenticatedException:當尚未完成成功認證時,嘗試執行授權操作時引發異常
shiro 核心組件
-
Authentication 身份認證/登錄,驗證用戶是不是擁有相應的身份。
-
Authorization 授權,即權限驗證,驗證某個已認證的用戶是否擁有某個權限;即判斷用戶是否能做事情,常見的如:驗證某個用戶是否擁有某個角色。或者細粒度的驗證某個用戶對某個資源是否具有某個權限。
-
SessionManagement 對用戶的會話信息進行管理,使 Session 不再僅限于 JavaEE 應用,同時擴展了 Session數據的存儲途徑及緩存方式,更易于實現 Session 數據的集群共享
-
Cryptography 加密,保護數據的安全性,以簡潔的 API 提供常用的加密算法和數據摘要算法。
shiro 選用:
1、使用 shiro 可以非常快速的完成認證、授權等功能的開發,降低系統成本
2、較之 SpringSecurity,Shiro 在保持強大功能的同時,在簡單性和靈活性方面擁有較為明顯的優勢
Kaptcha
Kaptcha 是一個用于生成和驗證驗證碼的 Java 庫,提供了豐富的生成和驗證功能,并支持自定義配置。它可以用于增加應用程序的安全性,防止機器人和惡意攻擊。
Kaptcha 可以生成各種類型的驗證碼,包括數字、字母、數字字母組合等。生成的驗證碼圖片可以以圖片流或Base64 編碼的形式輸出,方便在 Web 應用程序中使用。
在驗證碼驗證方面,Kaptcha 提供了驗證器接口,可以用于驗證用戶輸入的驗證碼是否正確。開發人員可以根據需要自定義驗證邏輯,以滿足特定的業務需求。
Cookie 的使用
Cookie 是一種在 Web 開發中使用客戶端數據存儲實現跟蹤用戶狀態的機制。所謂的跟蹤用戶是指記錄用戶操作信息并隔離不同用戶數據訪問的方法,常見的用戶跟蹤方法有隱藏域、URL 重寫、客戶端跟蹤用戶 Cookie
和服務器端跟蹤用戶 Session 四種不同方式。
理論上來說關于 cookie 的大小實際上沒有明確的限制。Cookie 是由網站在用戶瀏覽器中存儲的小型文本文件,用于跟蹤用戶的活動和提供個性化的服務。然而瀏覽器對于每個域名和每個 cookie 的大小都有一些限制。大多數現代瀏覽器對于單個 cookie 的大小限制在 4KB 到 10KB 之間,例如 chrome 的限制就是 4KB。同時每個域名在瀏覽器中可以存儲的 cookie 數量也有一定限制,一般在幾十到幾百個之間。
需要注意的是,這些限制可能因不同的瀏覽器和版本而有所不同。此外雖然 cookie 的大小限制較小,但網站可以通過將數據存儲在服務器上,并在 cookie 中使用標識符來處理更大量的數據。 總的來說,雖然 cookie的大小有一定限制,但對于大多數常見的用途和數據跟蹤來說,這些限制通常是足夠的。如果有特定的需求,可能需要考慮其他的數據存儲方式。
setMaxAge(int expiry) 正值表示 cookie 將在經過該值表示的秒數后過期,負值意味著 cookie 不會被持久存儲,將在 Web 瀏覽器退出時刪除,默認是-1,0 值表示馬上刪除 cookie。
setPath(String)指定路徑下的請求才會傳遞該 cookie 數據Cookie 中的中文亂碼可以使用 URLDecoder.decode(value,“UTF-8”)解決
Session 的使用
Session 是一種在 Web 開發中用于跟蹤用戶狀態的機制。它通過在服務器上存儲用戶數據,并為每個用戶分配一個唯一的標識符來實現。 在使用 Session 時,服務器會為每個用戶創建一個唯一的 Session ID,并將該 ID
存儲在用戶的瀏覽器中的 Cookie 中。當用戶發送請求時,服務器會根據 Session ID 來檢索和存儲與該用戶相關的數據。這使得服務器能夠跟蹤用戶的狀態和信息,例如登錄狀態、購物車內容等。Session 的使用有四方面需要注意:
- 安全性:由于 Session ID 存儲在用戶的 Cookie 中,需要采取適當的安全措施來保護 Session 數據。這包括
使用加密傳輸、限制 Session ID 的有效期等。
- 存儲容量:Session 數據存儲在服務器上,因此需要考慮服務器的存儲容量和性能。過多或過大的 Session數據可能會對服務器造成壓力。
- 生命周期:Session 可以有不同的生命周期設置,例如在用戶關閉瀏覽器后立即過期,或者在一定時間段內保持活動狀態。開發人員需要根據應用需求來配置 Session 的生命周期。
- 分布式環境:在分布式環境中,需要確保 Session 數據在不同服務器之間的共享和同步,以便用戶在不同服務器間切換時能夠保持會話狀態。
server.servlet.session.timeout=30m 表示 Session 將在 30 分鐘后超時
SpringSession
在傳統單機 web 應用中,用戶的 session 都是由容器管理。瀏覽器使用 cookie 中記錄 sessionId,容器根據sessionId 判斷用戶是否存在會話 session。限制是 session 存儲在 web 容器中,被單臺服務器容器管理。如果需要實現 session 共享的方式有 5 種:1、通過 nginx 的 ip_hash 負載均衡策略根據 ip 將請求分配到對應的服務器。2、基于關系型數據庫存儲共享數據。3、基于 cookie 客戶端數據存儲。4、某些服務器內置的有 session
復制域功能。5、可以基于 NoSQL 數據庫系統實現
Spring Session 是一個用于在分布式環境中管理和跟蹤用戶會話的框架。它提供了多種用戶會話存儲的實現方式,支持會話共享和跨域請求,具有良好的擴展性和自定義能力。主要是依賴于 SessionRepositoryFilter 實現,它就是Servlet 規范中 Filter 的實現,用來切換HttpSession 至Spring Session,重新定義包裝 HttpServletRequest和 HttpServletResponse
使用 Spring Session 功能
-
創建和管理會話:Spring Session 可以創建和管理用戶會話。它提供了 API 來創建新會話、獲取當前會話、設置會話屬性等。
-
共享會話數據:在分布式環境中,Spring Session 可以將會話數據存儲在共享的存儲介質中,以便不同的服務器可以訪問和共享相同的會話數據。
-
跨域請求支持:Spring Session 提供了跨域請求支持,使得在多個域名或子域名下共享會話變得更加容易。
-
擴展性和自定義:Spring Session 具有良好的擴展性,可以根據需要自定義會話存儲、會話管理和會話策略等。