Shiro
ShiroFilter的工作原理
DelegatingFilterProxy 作用是自動到 Spring 容器查找字爲 shiroFilter(filter-name)的 bean 並把所有 Filter 的操作委託給它。所以web.xml和spring 容器中的filter-name應該一樣。
URL匹配模式
Ant 路徑通配符支持 ?、*、**,注意通配符匹配不 包括目錄分隔符“/”:
– ?:匹配一個字符,如 /admin? 將匹配 /admin1,但不 匹配 /admin 或 /admin/;
– *:匹配零個或多個字符串,如 /admin*
將匹配/admin、 /admin123,但不匹配 /admin/1;
–** :匹配路徑中的零個或多個路徑,如 /admin/** 將匹 配 /admin/a 或 /admin/a/b
URL匹配順序
URL 權限採取第一次匹配優先的方式,即從頭開始 使用第一個匹配的 url 模式對應的攔截器鏈。
身份認證思路
- 獲取當前的subject,調用SecurityUtils.getSubject();
- 測試當前的用戶是否已經被認證,即是否已經登錄,調用subject的isAuthenticated()
- 若沒有被認證,則把用戶名和密碼封裝爲UsernamePasswordToken對象
- 創建一個表單頁面
- 把請求提交到Springmvc的Handler
- 獲取用戶名和密碼
- 執行登錄:調用subject的login(AuthenticationToken)方法。
- 自定義Realm的方法,從數據庫中獲取對應的記錄,返回給shiro。
- 實際上需要繼承org.apach.shiro.realm.AuthenticatingRealm類
- 實現doGetAuthenticationInfo(AuthenticationToken)方法。
- 由shiro完成對密碼的比對。
密碼的比對:
通過AuthenticatingRealm的credentialsMatcher屬性來進行的密碼比對。
- 如何把一個字符串加密爲MD5
替換當前的Realm的credentialsMatcher屬性,直接使用HashedCredentialsMatcher對象,並設置加密算法即可。
實現認證Realm步驟
實現授權
-
授權需要繼承AuthorizingRealm類,並實現其doGetAuthorizationInfo方法。
-
AuthorizingRealm類繼承自AuthenticatingRealm,但沒有實現AuthenticatingRealm中的doGetAuthenticationInfo,所以認證和授權只需要繼承
AuthorizingRealm就可以了,同時實現兩個抽象方法