1、簡單介紹一下Shiro框架?
Apache Shiro是Java的一個安全框架。使用Shiro可以非常容易的開發出足夠好的應用。其不僅可以用在JavaSE環境,也可以用在JavaEE環境。Shiro可以幫助我們完成功能:認證、授權、加密、會話管理、與Web集成、緩存等。
三個核心組件:Subject,SecurityManager和Realms。
● Subject:即“當前操作用戶”。但是在Shiro中Subject這一概念并不僅僅指人,也可以是第三方進程、后臺帳戶(Daemon Account)或其他類似事物。它僅僅意味著“當前跟軟件交互的東西”。但考慮到大多數目的和用途,你可以把它認為是Shiro的“用戶”概念。Subject代表了當前用戶的安全操作。
● SecurityManager:它是管理所有用戶的安全操作,是Shiro框架的核心,典型的Facade模式。Shiro通過SecurityManager來管理內部組件實例,并通過它來提供安全管理的各種服務。
● Realm:Realm充當了Shiro與應用安全數據間的“橋梁”或者“連接器”。也就是說,當對用戶執行認證(登錄)和授權(訪問控制)驗證時,Shiro會從應用配置的Realm中查找用戶及其權限信息。
● SecurityManager
典型的Facade,Shiro通過它對外提供安全管理的各種服務。
● Authenticator
對“Who are you?”進行核實。通常涉及用戶名和密碼。這個組件負責收集principals 和credentials,并將它們提交給應用系統。如果提交的credentials跟應用系統中提供的 credentials吻合,就能夠繼續訪問,否則需要重新提交principals和credentials,或者直 接終止訪問。
● Authorizer
身份份驗證通過后,由這個組件對登錄人員進行訪問控制的篩查,比如“who can do what”,或者“who can do which actions”。Shiro采用“基于Realm”的方法,即用戶 (又稱Subject)、用戶組、角色和permission的聚合體。
● Session Manager
這個組件保證了異構客戶端的訪問,配置簡單。它是基于POJO/J2SE的,不跟任何的 客戶端或者協議綁定。
● Application Code:應用程序代碼,就是我們自己的編碼,如果在程序中需要進行權限控制,需要調用Subject的API。
●Subject:主體代表了當前用戶。所有的Subject都綁定到SecurityManager,與Subject的所有交互都會委托給SecurityManager,可以將Subject當成一個門面,而真正執行者是SecurityManager。
● SecurityManage:安全管理器,所有與安全有關的操作都會與SecurityManager交互,并且它管理所有的Subject。
● Realm:域shiro是從Realm來獲取安全數據(用戶,角色,權限)。就是說SecurityManager
要驗證用戶身份,那么它需要從Realm獲取相應的用戶進行比較以確定用戶身份是否 合法;也需要從Realm得到用戶相應的角色/權限進行驗證用戶是否能進行操作;可以 把Realm看成DataSource,即安全數據源。
4、Shiro的四種權限控制方式?
● url級別權限控制
● 方法注解權限控制
● 代碼級別權限控制
對資源類型的管理稱為粗顆粒度權限控制,即只控制到菜單、按鈕、方法。粗粒度的例子比如:用戶具有用戶管理的權限,具有導出訂單明細的權限。
對資源實例的控制稱為細顆粒度權限管理,即控制到數據級別的權限,比如:用戶只允許修改本部門的員工信息,用戶只允許導出自己創建的訂單明細。
● 總結:
粗顆粒權限:針對url鏈接的控制。
細顆粒權限:針對數據級別的控制。
比如:衛生局可以查詢所有用戶,衛生室只可以查詢本單位的用戶。
對于粗顆粒度的授權可以很容易做系統架構級別的功能,即系統功能操作使用統一的粗顆粒度的權限管理。對于細顆粒度的授權不建議做成系統架構級別的功能,因為對數據級別的控制是系統的業務需求,隨著業務需求的變更業務功能變化的可能性很大,建議對數據級別的權限控制在業務層個性化開發,比如:用戶只允許修改自己創建的商品信息可以在service接口添加校驗實現,service接口需要傳入當前操作人的標識,與商品信息創建人標識對比,不一致則不允許修改商品信息。
粗顆粒權限:可以使用過慮器統一攔截url。
細顆粒權限:在service中控制,在程序級別來控制,個性化編程。