shiro 認證流程
認證流程
從上面流程可以看出最重要的就是 Authenticator 和 Realm.
入門程序
使用Shiro 架包搭建工程
注:這里暫時沒用到 Spring Hibernate 等架包.
構(gòu)建securityManager環(huán)境步驟
創(chuàng)建shiro-first.ini
#對用戶信息進行配置
[users]
#用戶賬號和密碼
zhangsan=111111
lisi=22222
// 創(chuàng)建securityManager工廠炫彩,通過ini配置文件創(chuàng)建securityManager工廠
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:shiro-first.ini");
// 創(chuàng)建SecurityManager
SecurityManager securityManager = factory.getInstance();
// 將securityManager設(shè)置當前的運行環(huán)境中
SecurityUtils.setSecurityManager(securityManager);
// 從SecurityUtils里邊創(chuàng)建一個subject
Subject subject = SecurityUtils.getSubject();
// 在認證提交前準備token(令牌)
// 這里的賬號和密碼 將來是由用戶輸入進去
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
"111111");
try {
// 執(zhí)行認證提交
subject.login(token);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 是否認證通過
boolean isAuthenticated = subject.isAuthenticated();
System.out.println("是否認證通過:" + isAuthenticated);
// 退出操作
subject.logout();
// 是否認證通過
isAuthenticated = subject.isAuthenticated();
System.out.println("是否認證通過:" + isAuthenticated);
程序執(zhí)行流程
- 通過 ini 配置文件創(chuàng)建SecurityManager
- 調(diào)用 subject.login() 方法提交認證.
內(nèi)部通過 SecurityManager 進行認證,在SecurityManager進行認證的時候會調(diào)用 Authenticator 接口的實現(xiàn)類 RealmSecurityManager.
Authenticator 接口實現(xiàn)類
3.然后 RealmSecurityManager 再去調(diào)用 ModularRealmAuthenticator 進行認證.認證時 ModularRealmAuthenticator 會拿著用戶輸入的 token 和 shiro-first.ini 中配置的用戶賬號和密碼進行對比.
4.如何對比呢?
ModularRealmAuthenticator 會調(diào)用 Realm 接口的實現(xiàn)類 IniRealm, IniRealm 負責從 shiro-first.ini 中查詢用戶信息(賬號和密碼), 如果找不到賬號會返回 null, 如果找到賬號,則會將賬號和密碼返回.
ModularRealmAuthenticator 會判斷 IniRealm 返回的信息,如果為 null 則跑出 org.apache.shiro.authc.UnknownAccountException
異常.
如果密碼輸出錯,則跑出org.apache.shiro.authc.IncorrectCredentialsException
異常.
Realm 接口的實現(xiàn)
總結(jié)
IniRealm: 讀取 ini 配置文件, 將來要連接數(shù)據(jù),那么就需要仿照此類來讀取數(shù)據(jù)庫的賬號和密碼.
RealmSecurityManager: 用來判斷Realm找到的用戶名和密碼是否匹配, 或是否找到用戶.