shiro有三大部分組成:subject,securitymanager,realm
subject:負責於專案進行互動,暴露給外界使用,subject儲存著使用者的基礎資訊。
securitymanager:subject會將認證委託給securitymanager進行認證。
realm:儲存著使用者的核心資訊,儲存著資料來源。例如:許可權密碼。
執行原理:
得到subject之後,它是用來操作鑑權的起點,當前端的使用者輸入賬號和密碼,後台接收到之後,封裝成乙個usernamepassword物件,注意這個物件儲存的是前端輸入的明文密碼,當subject呼叫login方法之後,subject將認證的流程委託給
securitymanager,securitymanager會呼叫認證器,去進行認證判斷,認證判斷的資料是從realm中獲取過來的,realm的資料可以從int配置檔案獲取,也可以從資料庫獲取。這裡假設是從資料庫獲取的。
通過使用者名稱從資料庫中獲取密碼和鹽值,查詢之後將從資料庫查詢出來的使用者名稱、密碼、鹽值、ream名傳遞構建出來******authenticationinfo物件返回。
注意這個地方的鹽值,如果在資料不是字串的話需要進行轉換。
也許有人會很奇怪,前端的明文密碼是如何和資料中的密碼做檢驗的呢?因為在你構建usernameandpassword的時候,就將使用者名稱和密碼交給shiro管理了。然後再自定i的realm中又傳遞進去了鹽值和加密後的密碼。
這些資料最終會到達
這個地方會將鹽值取出然後將明文密碼加密,然後和資料庫的密碼做比較。
使用shiro做許可權控制,如果realm是從資料庫獲取資料的話,資料庫至少要有三張表:使用者表、角色表、角色許可權表。
shiro可以可以做乙個使用者是否已經登入。
可以做許可權的認證,攔截。
可以做乙個使用者只能在乙個程式上登入一次。
注意:realm只做資料的維護,提供資料;提供給securitymanager使用。
加密:
現在資料庫中一般儲存的都是密文密碼。
那shiro是如何實現加密後的匹配的呢?
流程:1、realm設定認證匹配器,認證匹配器設定加密的規則。
2、將realm設定給securitymanager。
3、當前端輸入賬號密碼之後,後端將輸入的明文賬號和密碼使用usernamepasswordtoken進行包裝。在和資料庫中的密碼進行匹配的時候,這個明文的密碼由於realm設定了認證匹配器,所以在進行認證的時候,會將前端的明文密碼也進行加密,然後在匹配。(注意:我該開始的時候以為是將資料庫取出的密碼轉成明文,但是現在的加密都是不可逆的,並且如果將資料庫中的密碼解密出來在和明文密碼做檢驗的話,也就是失去了加密的意義了)
4、這個地方在realm中,會使用前端輸入的使用者名稱,不用密碼,先去查詢使用者,然後將查詢的使用者的密碼傳入******authen
比較需要注意這個地方:
shiro預設採用的密碼是十六進製制的,如果你傳遞過來的不是十六進製制的話,需要再認證匹配其哪個地方指定
//設定系統憑證的編碼轉換格式,也就是密碼轉成什麼格式去比對,預設為true,表示16進製制,
hashedcredentialsmatcher.setstoredcredentialshexencoded(false);
表示不使用16進製制。
這裡的進製數一定要統一。
Shiro許可權認證
shiro的授權以及許可權 關係圖 我們需要在service層中先寫好方法 public inte ce shirouserservice然後imp繼承 service shirouserservice public class shirouserserviceimpl implements shi...
Shiro許可權認證Web
目錄 shiro內建的過濾器講解 filter配置路徑 shiro 資料安全之資料加解密 1.核心過濾器類 defaultfilter,配置哪個路徑對應哪個 進行處理 2.authc org.apache.shiro.web.filter.authc.formauthenticationfilter...
Shiro許可權管理(二) 認證
時隔這麼久終於有時間更新了,今天和大家分享一下shiro的原理。我認為無論是shiro也好,還是其他安全框架也好,其功能主要就分為三部分 認證 授權 加密。下面我們來詳細說明shiro具體是如何實現的。講原理當然離不開結構圖,我們先來看一下shiro的整體結構。由shiro的結構圖我們可以看出shi...