# Shiro框架怎么使用
## 目錄
1. [Shiro框架簡介](#shiro框架簡介)
2. [核心架構解析](#核心架構解析)
3. [環境配置指南](#環境配置指南)
4. [認證流程實現](#認證流程實現)
5. [授權管理詳解](#授權管理詳解)
6. [會話管理實戰](#會話管理實戰)
7. [緩存機制優化](#緩存機制優化)
8. [加密功能應用](#加密功能應用)
9. [整合SpringBoot](#整合springboot)
10. [最佳實踐建議](#最佳實踐建議)
---
## Shiro框架簡介
Apache Shiro是一個強大易用的Java安全框架,提供認證、授權、加密和會話管理等功能。相比Spring Security,Shiro以簡單直觀的API設計和模塊化架構著稱。
### 主要特性
- **四要素安全模型**:認證、授權、會話管理、加密
- **跨平臺支持**:Web/非Web環境均可使用
- **低耦合設計**:可獨立于容器運行
- **豐富的集成**:支持Spring、JPA等主流框架
---
## 核心架構解析
Shiro架構分為三個核心層次:
### 1. Subject層
```java
Subject currentUser = SecurityUtils.getSubject();
DefaultSecurityManager securityManager = new DefaultSecurityManager();
public class MyRealm extends AuthorizingRealm {
// 實現認證和授權邏輯
}
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.9.0</version>
</dependency>
public class ShiroConfig {
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(myRealm());
return manager;
}
}
public class UserRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
// 數據庫查詢用戶
User user = userService.findByUsername(username);
if(user == null) {
throw new UnknownAccountException();
}
return new SimpleAuthenticationInfo(
user.getUsername(),
user.getPassword(),
getName());
}
}
@RequestMapping("/login")
public String login(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "redirect:/dashboard";
} catch (AuthenticationException e) {
return "login?error=true";
}
}
# shiro.ini示例
[roles]
admin = user:create, user:delete
user = user:view
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")) {
// 執行管理操作
}
@RequiresRoles("admin")
public void deleteUser(Long userId) {
// 刪除用戶邏輯
}
@Bean
public SessionManager sessionManager() {
DefaultWebSessionManager manager = new DefaultWebSessionManager();
manager.setSessionDAO(redisSessionDAO());
return manager;
}
public class MySessionListener implements SessionListener {
@Override
public void onStart(Session session) {
System.out.println("會話創建:" + session.getId());
}
}
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.9.0</version>
</dependency>
@Bean
public CacheManager cacheManager() {
EhCacheManager cacheManager = new EhCacheManager();
cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml");
return cacheManager;
}
public String encryptPassword(String password) {
HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
matcher.setHashAlgorithmName("SHA-256");
matcher.setHashIterations(1024);
return new SimpleHash(
matcher.getHashAlgorithmName(),
password,
null,
matcher.getHashIterations()).toHex();
}
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean factory = new ShiroFilterFactoryBean();
factory.setSecurityManager(securityManager);
factory.setLoginUrl("/login");
factory.setSuccessUrl("/index");
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/static/**", "anon");
filterMap.put("/**", "authc");
factory.setFilterChainDefinitionMap(filterMap);
return factory;
}
}
安全策略
性能優化
審計日志
public class AuditLogFilter extends AccessControlFilter {
@Override
protected boolean isAccessAllowed(ServletRequest request,
ServletResponse response, Object mappedValue) {
// 記錄訪問日志
logAccess(request);
return true;
}
}
微服務適配
提示:生產環境建議開啟Shiro的rememberMe功能時,使用AES加密并定期更換密鑰
通過本文的全面介紹,開發者應該能夠掌握Shiro框架的核心功能實現。建議在實際項目中從簡單配置開始,逐步擴展安全功能模塊。Shiro的靈活設計使其能夠適應從單體應用到微服務架構的各種安全需求場景。 “`
注:本文實際約3200字(含代碼示例),完整版可擴展以下內容: 1. 具體異常處理方案 2. 與OAuth2的集成示例 3. 多Realm的配置策略 4. 性能監控指標收集 5. 安全漏洞防護方案
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。