SimpleAuthenticationInfo 在 Shiro 中的作用和實現

一、SimpleAuthenticationInfo 簡介

SimpleAuthenticationInfo 是 Shiro 框架的核心組件之一,用於封裝身份驗證信息,實現自定義的身份認證和授權邏輯,結合相關的 Realm 實現調用。它通過封裝了認證成功後的用戶身份信息、密碼、鹽等,來提供給 Realm 實現進行後續的授權驗證。

二、SimpleAuthenticationInfo 的構造和方法

SimpleAuthenticationInfo 的構造方法如下:

SimpleAuthenticationInfo(Object principal, Object credentials, String realmName)
SimpleAuthenticationInfo(Object principal, Object hashedCredentials, ByteSource credentialsSalt, String realmName)

構造方法參數說明:

  • principal:用戶身份信息,通常為用戶名或用戶實體對象
  • credentials:用戶憑證,即密碼或密碼的密文
  • hashedCredentials:加密後的用戶憑證,即密碼的密文
  • credentialsSalt:密碼加密的鹽值,通常使用用戶的唯一標識信息進行加密
  • realmName:Realm 名稱,即應用程序或系統唯一的 Realm 標識

SimpleAuthenticationInfo 中比較常用的方法如下:

Object getPrinicipal()
Object getCredentials()
Object getCredentialsSalt()
String getRealmName()

三、SimpleAuthenticationInfo 的實現示例

下面以自定義的 Realm 實現為例,介紹 SimpleAuthenticationInfo 的具體使用方法:

1. Realm 實現示例

public class CustomRealm extends AuthorizingRealm {

    // 用於認證的方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 獲取用戶輸入的用戶名和密碼
        String userName = (String) token.getPrincipal();
        String password = new String((char[]) token.getCredentials());
        // 模擬數據庫中的用戶數據
        if (!"admin".equals(userName)) {
            throw new UnknownAccountException(); // 沒有找到賬號
        }
        if (!"123456".equals(password)) {
            throw new IncorrectCredentialsException(); // 密碼錯誤
        }
        // 創建 SimpleAuthenticationInfo 對象
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(userName, password, getName());
        // 返回 SimpleAuthenticationInfo 對象
        return authenticationInfo;
    }

    // 用於授權的方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }
}

2. 用戶認證示例

// 獲取當前操作的用戶
Subject currentUser = SecurityUtils.getSubject();
// 創建一個身份驗證 Token
UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456");
// 身份認證
try {
    currentUser.login(token);
    System.out.println("身份認證成功");
} catch (UnknownAccountException e) {
    System.out.println("沒有找到賬戶");
} catch (IncorrectCredentialsException e) {
    System.out.println("密碼錯誤");
} catch (AuthenticationException e) {
    System.out.println("身份認證失敗");
}

3. 密碼加密示例

// 獲取鹽值
ByteSource salt = ByteSource.Util.bytes("admin");
// 獲取加密後的密碼
String newPassword = new SimpleHash("MD5", "123456", salt, 2).toHex();
System.out.println(newPassword);

四、SimpleAuthenticationInfo 的使用場景

SimpleAuthenticationInfo 主要用於自定義身份驗證邏輯,可以結合相關的 Realm 實現進行調用。在大部分應用程序中,都需要對用戶進行身份認證,而 SimpleAuthenticationInfo 提供了一種通用的方式,來封裝身份認證所需的信息,從而簡化了實現的複雜度,提高了程序的可擴展性和可維護性。

五、SimpleAuthenticationInfo 的注意事項

在使用 SimpleAuthenticationInfo 時需要注意以下幾點:

  • SimpleAuthenticationInfo 是線程安全的,可以在多個線程中共享使用。
  • SimpleAuthenticationInfo 必須與 Realm 一起使用,否則將無法實現自定義的身份認證邏輯。
  • 在進行用戶身份認證時,強烈建議使用加密處理的密碼,尤其是在實際應用中對密碼進行存儲時。

原創文章,作者:ORHL,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/147739.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ORHL的頭像ORHL
上一篇 2024-11-02 13:11
下一篇 2024-11-02 13:11

相關推薦

  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • @scope("prototype")的作用及應用

    本文將從以下幾個方面進行詳細闡述@scope(“prototype”)在編程開發中的作用和應用。 一、代碼復用 在開發中,往往會有很多地方需要復用同一個類的…

    編程 2025-04-28
  • Python中import sys的作用

    Python是一種非常強大的編程語言,它的標準庫提供了許多有用的模塊和函數。sys模塊是Python標準庫中的一個重要模塊,用於與Python解釋器和操作系統進行交互。它允許開發者…

    編程 2025-04-28
  • Python配置環境變量的作用

    Python配置環境變量是為了讓計算機能夠更方便地找到Python語言及其相關工具的位置,使其可以在任意目錄下使用Python命令。當您安裝Python後,您需要進行環境變量設置,…

    編程 2025-04-28
  • Python的意義和作用

    Python是一種高級語言,它的簡潔易讀和豐富的庫使得它成為了廣泛使用的編程語言之一。Python可以完成諸如數據科學、機器學習、網絡編程等各種任務,因此被很多開發人員和研究人員視…

    編程 2025-04-27
  • Python定義空列表及其作用

    Python是一種廣泛使用的強類型解釋型編程語言。在Python中,我們可以使用列表來存儲一系列不同類型的元素。列表是Python內置的一種高效數據結構,可以在其中存儲任意數量的元…

    編程 2025-04-27
  • 理解Python __init__的作用

    對__init__的作用進行詳細的闡述,並給出對應代碼示例。 一、對象實例化與構造函數 在面向對象編程中,我們經常需要創建對象,而對象的創建和初始化需要先定義一個類,然後通過在類中…

    編程 2025-04-27
  • 從多個角度詳細解析endup函數的作用

    一、代碼示例 /** * 將字符串末尾的n個字符移到字符串開頭 * @param {string} str – 需要進行字符處理的字符串 * @param {number} n -…

    編程 2025-04-25
  • Redis的作用

    一、緩存 Redis最常見的用途是作為緩存。所謂緩存,就是將頻繁讀取、但不經常修改的數據存儲在內存中,用戶請求數據時優先從內存中讀取,可大幅提升數據訪問效率。Redis的數據結構特…

    編程 2025-04-24

發表回復

登錄後才能評論