更新時間:2021-07-29 17:01:22 來源:動力節(jié)點 瀏覽1449次
1.什么是shiro
shiro是apache公司下一款優(yōu)秀的Java安全認證框架,它強大且容易使用,它支持身份驗證、授權(quán)、密碼和會話管理功能,與shiro有著同樣功能的框架是Spring Security,對比Spring Security來看,shiro用起來簡單且可以脫離Spring使用,但是Spring Security不能夠脫離Spring去使用,shiro屬于一種輕量級的框架,所以許多公司都在使用shiro。
2.框架原理圖及名詞解釋
名詞解釋
subject:主體,可以是用戶也可以是程序,主體要訪問系統(tǒng),系統(tǒng)需要對主體進行認證、授權(quán)。
securityManager:安全管理器,主體進行認證和授權(quán)都是通過securityManager進行。它包含下面的認證器和授權(quán)器。
authenticator:認證器,主體進行認證最終通過authenticator進行的。
authorizer:授權(quán)器,主體進行授權(quán)最終通過authorizer進行的。
sessionManager:web應(yīng)用中一般是用web容器對session進行管理,shiro也提供一套session管理的方式??梢詫崿F(xiàn)單點登錄。
SessionDao:通過SessionDao管理session數(shù)據(jù),針對個性化的session數(shù)據(jù)存儲需要使用sessionDao。
cache Manager:緩存管理器,主要對session和授權(quán)數(shù)據(jù)進行緩存,比如將授權(quán)數(shù)據(jù)通過cacheManager進行緩存管理,和ehcache整合對緩存數(shù)據(jù)進行管理。
realm:域,領(lǐng)域,相當于數(shù)據(jù)源,通過realm存取認證、授權(quán)相關(guān)數(shù)據(jù)。(它的主要目的是與數(shù)據(jù)庫打交道,查詢數(shù)據(jù)庫中的認證的信息(比如用戶名和密碼),查詢授權(quán)的信息(比如權(quán)限的code等,所以這里可以理解為調(diào)用數(shù)據(jù)庫查詢一系列的信息,一般情況下在項目中采用自定義的realm,因為不同的業(yè)務(wù)需求不一樣))
注意:在realm中存儲授權(quán)和認證的邏輯。
cryptography:密碼管理,提供了一套加密/解密的組件,方便開發(fā)。比如提供常用的散列、加/解密等功能,比如md5散列算法。
認證原理圖
認證流程
subject(主體)請求認證,調(diào)用subject.login(token)
SecurityManager(安全管理器)執(zhí)行認證
SecurityManager通過ModularRealmAuthenticator進行認證。
ModularRealmAuthenticator將token傳給realm,realm根據(jù)token中用戶信息從數(shù)據(jù)庫查詢用戶信息(包括身份和憑證),realm如果查詢不到用戶給ModularRealmAuthenticator返回null,ModularRealmAuthenticator拋出異常(用戶不存在),realm如果查詢到用戶給ModularRealmAuthenticator返回AuthenticationInfo(認證信息),ModularRealmAuthenticator拿著AuthenticationInfo(認證信息)去進行憑證(密碼)比對。如果一致則認證通過,如果不致拋出異常(憑證錯誤)。
授權(quán)原理圖
授權(quán)流程
對subject進行授權(quán),調(diào)用方法isPermitted("")或者hasRole("")
SecurityManager執(zhí)行授權(quán),通過ModularRealmAuthorizer執(zhí)行授權(quán)
ModularRealmAuthorizer執(zhí)行realm(自定義的CustomRealm)從數(shù)據(jù)庫查詢權(quán)限數(shù)據(jù)調(diào)用realm的授權(quán)方法:doGetAuthorizationInfo
realm從數(shù)據(jù)庫查詢權(quán)限數(shù)據(jù),返回ModularRealmAuthorizer
ModularRealmAuthorizer調(diào)用PermissionResolver進行權(quán)限串比對
如果比對后,isPermitted中"permission串"在realm查詢到權(quán)限數(shù)據(jù)中,說明用戶訪問permission串有權(quán)限,否則沒有權(quán)限,拋出異常。
Shiro過濾器標簽配置列表及權(quán)限可訪問對比
/admins/**=anon # 表示該 uri 可以匿名訪問/admins/**=auth # 表示該 uri 需要認證才能訪問/admins/**=authcBasic # 表示該 uri 需要 httpBasic 認證/admins/**=perms[user:add:*] # 表示該 uri 需要認證用戶擁有 user:add:* 權(quán)限才能訪問/admins/**=port[8081] # 表示該 uri 需要使用 8081 端口/admins/**=rest[user] # 相當于 /admins/**=perms[user:method],其中,method 表示 get、post、delete 等/admins/**=roles[admin] # 表示該 uri 需要認證用戶擁有 admin 角色才能訪問/admins/**=ssl # 表示該 uri 需要使用 https 協(xié)議/admins/**=user # 表示該 uri 需要認證或通過記住我認證才能訪問/logout=logout # 表示注銷,可以當作固定配置
以上就是動力節(jié)點小編介紹的"Shiro框架原理解析",希望對大家有幫助,想了解更多可查看Shiro視頻教程。動力節(jié)點在線學(xué)習(xí)教程,針對沒有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
初級 202925
初級 203221
初級 202629
初級 203743