筆記
Shiro登陸認證流程
1.通過SeucrityUtils獲取當前用戶(Subject),調用SecurityUtils.getSubject()方法
2.判斷用戶是否登陸currentUser.isAuthenticated()
3.如果用戶沒有登陸,獲取登錄頁面傳過來的值(SpringMVC@Handler)
4.創建令牌UsernamePasswordToken token = new UsernamePasswordToken(#userName, #password)
5.通過Realm(繼承org.apache.shiro.realm.AuthenticatingRealm)與數據庫中的用戶密碼比對
密碼的比對:通過 AuthenticatingRealm 的 credentialsMatcher 屬性來進行的密碼的比對!
密碼加密
# 如何把一個字符串加密爲 MD5?
替換當前 Realm 的 credentialsMatcher 屬性. 直接使用 HashedCredentialsMatcher 對象, 並設置加密算法即可.
# 使用 MD5 鹽值加密:
如何做到:
1). 在 doGetAuthenticationInfo 方法返回值創建 SimpleAuthenticationInfo 對象的時候, 需要使用
SimpleAuthenticationInfo(principal, credentials, credentialsSalt, realmName) 構造器
2). 使用 ByteSource.Util.bytes() 來計算鹽值.
3). 鹽值需要唯一: 一般使用隨機字符串或 user id
4). 使用 new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 來計算鹽值加密後的密碼的值.
#如何授權
1. 授權需要繼承 AuthorizingRealm 類, 並實現其 doGetAuthorizationInfo 方法
2. AuthorizingRealm 類繼承自 AuthenticatingRealm, 但沒有實現 AuthenticatingRealm 中的
doGetAuthenticationInfo, 所以認證和授權只需要繼承 AuthorizingRealm 就可以了. 同時實現他的兩個抽象方法.
總結:1.Shiro加密原先實現方法都是寫加密工具類,可以通過配置MD5鹽值加密,這樣加密都不用自己實現,當然你向數據庫中存數據時當然要手寫加密算法,一會把之前做多Realm測試的加密算法貼出來
2.URL權限資源可以放到配置文件或數據庫中,這些就降低了Spring配置文件的壓力,一堆堆的URL配置很佔空間.
3.授權時要注意在配置MD5鹽值加密時注意接口
4.我在學習時候已經把上面的筆記寫在配置文件中了
public static void main(String[] args) {
String algorithmName="MD5" ;
Object source="admin1234" ;
String salt="admin";
int hashIterations=1024 ;
Object result= new SimpleHash(algorithmName, source, salt, hashIterations) ;
System.out.println(result); //02bad5ac06ea6ce0be3a24fd39781d11
}