# 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
在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. 匹配配置的過濾器鏈
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: 返回響應
Token創建:
UsernamePasswordToken token = new UsernamePasswordToken(
username, password);
提交認證:
Subject currentUser = SecurityUtils.getSubject();
currentUser.login(token);
Realm驗證:
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
// 實現數據庫查詢等邏輯
}
成功處理: - 創建Subject會話 - 存儲Principal信息 - 跳轉至成功頁面
失敗處理:
- 拋出特定異常:
- IncorrectCredentialsException
(密碼錯誤)
- UnknownAccountException
(賬號不存在)
- 返回401狀態碼或錯誤頁面
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;
}
@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;
}
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 |
@Bean
public CacheManager cacheManager() {
return new MemoryConstrainedCacheManager();
}
生產環境建議:
安全增強措施:
// 強制密碼復雜度
@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. 歷史版本演進對比 需要擴展哪個部分可以具體說明。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。