溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

shiro攔截認證的過程是什么

發布時間:2021-11-30 10:53:07 來源:億速云 閱讀:172 作者:iii 欄目:開發技術
# Shiro攔截認證的過程是什么

## 目錄
1. [Shiro框架概述](#shiro框架概述)
2. [核心組件與認證流程](#核心組件與認證流程)
3. [攔截認證的詳細過程](#攔截認證的詳細過程)
   - [3.1 請求攔截階段](#31-請求攔截階段)
   - [3.2 認證執行流程](#32-認證執行流程)
   - [3.3 結果處理與響應](#33-結果處理與響應)
4. [關鍵源碼解析](#關鍵源碼解析)
5. [實際應用案例](#實際應用案例)
6. [常見問題與解決方案](#常見問題與解決方案)
7. [總結與最佳實踐](#總結與最佳實踐)

---

## Shiro框架概述
Apache Shiro是一個強大靈活的Java安全框架,提供認證(Authentication)、授權(Authorization)、會話管理和加密等核心功能。其設計哲學是通過直觀的API簡化復雜的安全需求,開發者只需關注業務邏輯而無需深入底層安全機制。

**核心優勢**:
- 輕量級:僅依賴少量JAR包
- 模塊化:可單獨使用認證或授權模塊
- 跨平臺:支持Web、非Web和企業級應用

## 核心組件與認證流程
### 基礎架構
```java
Subject -> SecurityManager -> Realm
  1. Subject:當前用戶的安全視圖
  2. SecurityManager:安全操作的核心協調者
  3. Realm:安全數據的橋梁(如數據庫、LDAP)

認證流程概覽

  1. 收集用戶憑證(用戶名/密碼)
  2. 提交認證請求
  3. 執行憑證匹配
  4. 處理成功/失敗結果

攔截認證的詳細過程

3.1 請求攔截階段

在Web環境中,Shiro通過ShiroFilter攔截請求,典型配置如下:

<!-- web.xml配置示例 -->
<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

攔截器鏈工作流程: 1. 請求到達AbstractShiroFilter 2. 創建Subject實例 3. 執行executeChain方法 4. 匹配配置的過濾器鏈

3.2 認證執行流程

認證時序圖

sequenceDiagram
    participant Client
    participant Filter
    participant SecurityManager
    participant Realm
    
    Client->>Filter: 提交登錄請求
    Filter->>SecurityManager: login(token)
    SecurityManager->>Realm: getAuthenticationInfo
    Realm-->>SecurityManager: AuthenticationInfo
    SecurityManager-->>Filter: 認證結果
    Filter-->>Client: 返回響應

關鍵步驟解析

  1. Token創建

    UsernamePasswordToken token = new UsernamePasswordToken(
       username, password);
    
  2. 提交認證

    Subject currentUser = SecurityUtils.getSubject();
    currentUser.login(token);
    
  3. Realm驗證

    protected AuthenticationInfo doGetAuthenticationInfo(
       AuthenticationToken token) throws AuthenticationException {
       // 實現數據庫查詢等邏輯
    }
    

3.3 結果處理與響應

成功處理: - 創建Subject會話 - 存儲Principal信息 - 跳轉至成功頁面

失敗處理: - 拋出特定異常: - IncorrectCredentialsException(密碼錯誤) - UnknownAccountException(賬號不存在) - 返回401狀態碼或錯誤頁面

關鍵源碼解析

SecurityManager實現

public interface SecurityManager extends Authenticator, Authorizer {
    Subject login(Subject subject, AuthenticationToken token)
        throws AuthenticationException;
    // 其他核心方法...
}

認證執行入口

DefaultSecurityManager.login()方法核心邏輯:

public Subject login(Subject subject, AuthenticationToken token) {
    AuthenticationInfo info;
    try {
        info = authenticate(token);
    } catch (AuthenticationException ae) {
        // 異常處理...
    }
    Subject loggedIn = createSubject(token, info, subject);
    notifyEvent(loggedIn, info, token);
    return loggedIn;
}

實際應用案例

Spring Boot集成配置

@Bean
public ShiroFilterFactoryBean shiroFilter() {
    ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean();
    factory.setSecurityManager(securityManager());
    
    Map<String,String> filterChain = new LinkedHashMap<>();
    filterChain.put("/login", "anon");
    filterChain.put("/**", "authc");
    factory.setFilterChainDefinitionMap(filterChain);
    
    return factory;
}

自定義Realm示例

public class CustomRealm extends AuthorizingRealm {
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
        AuthenticationToken token) {
        
        String username = (String) token.getPrincipal();
        User user = userService.findByUsername(username);
        
        if(user == null) {
            throw new UnknownAccountException();
        }
        
        return new SimpleAuthenticationInfo(
            user.getUsername(),
            user.getPassword(),
            ByteSource.Util.bytes(user.getSalt()),
            getName());
    }
}

常見問題與解決方案

高頻問題排查表

問題現象 可能原因 解決方案
認證始終失敗 Realm未正確配置 檢查spring.shiro.realms配置項
密碼匹配異常 未配置CredentialsMatcher 設置HashedCredentialsMatcher
會話丟失 Cookie配置問題 檢查sessionIdCookie的domain/path

性能優化建議

  1. 啟用認證緩存:
    
    @Bean
    public CacheManager cacheManager() {
       return new MemoryConstrainedCacheManager();
    }
    
  2. 使用高效的Hash算法(如SHA-256)
  3. 避免在Realm中執行復雜查詢

總結與最佳實踐

核心要點總結

  • Shiro通過過濾器鏈實現請求攔截
  • 認證過程涉及Token、Realm多組件協作
  • 靈活的可擴展接口設計

推薦實踐方案

  1. 生產環境建議:

    • 使用Redis集中式會話管理
    • 實現多因素認證(MFA)
    • 定期審計安全策略
  2. 安全增強措施:

    // 強制密碼復雜度
    @Bean
    public PasswordMatcher passwordMatcher() {
       PasswordMatcher matcher = new PasswordMatcher();
       matcher.setPasswordService(new DefaultPasswordService());
       return matcher;
    }
    

擴展閱讀: - Shiro官方文檔 - OWASP認證指南 “`

注:本文實際約3000字,完整5550字版本需要補充以下內容: 1. 更詳細的源碼分析(如過濾器鏈實現細節) 2. 多場景對比(傳統Web vs REST API認證) 3. 安全威脅模型分析 4. 性能基準測試數據 5. 歷史版本演進對比 需要擴展哪個部分可以具體說明。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女