Shiro框架學習筆記(二)基於內置ini文件的身份認證

一開始學習我們先從簡單的開始學習,先不從數據庫中取數據來進行交互檢測,先通過內置一個shiro.ini文件來進行簡單的身份驗證。
shiro.ini文件如下:

#定義⽤戶信息
#格式:⽤戶名=密碼,⻆⾊1,⻆⾊2,....
[users]
zhangsan=123,admin
lisi=456,manager,seller
wangwu=789,clerk
# -----------------------------------------------------------------------------
# ⻆⾊及其權限信息
# 預定權限:user:query
# user:detail:query
# user:update
# user:delete
# user:insert
# order:update
# ....
[roles]
# admin 擁有所有權限,*表示
admin=*
# clerk 只有查詢權限
clerk=user:query,user:detail:query
# manager 有 user 的所有權限
manager=user:*

shiro.ini文件位置如下
在這裏插入圖片描述
我們先通過控制檯程序先測試,之後會集成到web項目中,接下來就是程序代碼:

// 定義main函數測試效果
// 創建 "SecurityFactory",加載ini配置,並通過它創建SecurityManager
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

// 將SecurityManager託管到SecurityUtils⼯具類中(ops:之後可以不必關⼼SecurityManager)
//因爲直接操作SecurityManager太複雜、易出錯。
SecurityUtils.setSecurityManager(securityManager);

// 獲得Subject,通過subject可以執⾏shiro的相關功能操作(身份認證或權限校驗等)
//幾乎所有操作,除了加密,因爲加密是其他模塊,可以在架構圖看到。每次創建了subject都會從session中同步一下信息。直接由用戶使用,調用功能簡單,其底層調用Securitymanager的相關流程
Subject currentUser = SecurityUtils.getSubject();

// 身份認證( 類似登錄邏輯 )
if (!currentUser.isAuthenticated()) {//判斷是否已經登錄
    //如果未登錄,則封裝⼀個token,其中包含 ⽤戶名和密碼
    //這裏是我們的主要測試步驟,讀者們可以通過簡單修改用戶名和密碼來進行一般的檢測
    UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123");
    try {
        //將token傳⼊login⽅法,進⾏身份認證 (判斷⽤戶名和密碼是否正確)
        currentUser.login(token);//如果失敗則會拋出異常
    } catch (UnknownAccountException uae) {//⽤戶不存在
        System.out.println("There is no user with username of " + token.getPrincipal());
    } catch (IncorrectCredentialsException ice) {//密碼錯誤
        System.out.println("Password for account " + token.getPrincipal() + " was incorrect!");
    } catch (LockedAccountException lae) {//賬戶凍結,例如多次登陸
        System.out.println("The account for username " 
                   + token.getPrincipal() 
                   + " is locked. Please contact your administrator to unlock it.");
    }catch (AuthenticationException ae) {//其他認證異常
    }
}

// 認證成功則⽤戶信息會存⼊ currentUser(Subject)
System.out.println("User [" + currentUser.getPrincipal() + "] logged in successfully.");
// ⽤戶退出,會清除⽤戶狀態 身份信息,登錄狀態信息,權限信息,角色信息,會話信息 全部抹除
currentUser.logout();
// System.exit(0);

主要是先創建SecurityManager對象,之後將該對象交由SecurityUtils來進行管理,之後在進行身份驗證時主要是通過獲取SecurityUtils獲取到當前的登錄用戶,之後通過該用戶的用戶名以及密碼創建相應的令牌,之後通過subject.login(token)來實現身份的驗證,不再像之前一樣進行復雜的sql語句的驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章