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