1. 为什么选择Shiro进行权限认证?
在Java生态中,权限认证框架的选择往往让人纠结。我经历过从原生Servlet过滤器到Spring Security的完整迁移过程,最终在中小型项目中坚定选择了Shiro。这里有个反直觉的事实:功能更全面的Spring Security在实际业务中往往存在严重的过度设计问题。
Shiro的核心优势在于它的"够用哲学"。它的四大核心模块——认证(Authentication)、授权(Authorization)、会话管理(Session)和加密(Cryptography)——通过简洁的API提供了完整的安全解决方案。我曾在一个日活10万+的电商项目中实测,Shiro在RBAC模型下的性能开销比Spring Security低30%左右,特别是在鉴权链较长的场景下差异更为明显。
实际开发中常见误区:很多开发者会直接拷贝网络上的Shiro配置模板,却忽略了最重要的Session管理配置。我在生产环境曾遇到过因sessionTimeout设置不当导致的OOM问题,这点后续会详细说明。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 项目环境搭建与基础配置
2.1 依赖管理的关键细节
使用Spring Boot 2.7.x + Shiro 1.11.0的组合时,Maven配置需要特别注意版本兼容性:
xml复制<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.11.0</version>
</dependency>
<!-- 必须添加的辅助依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>1.11.0</version>
</dependency>
这里有个容易踩的坑:shiro-spring-boot-starter和shiro-spring-boot-web-starter的区别。后者包含了web相关的自动配置,如果项目是Web应用必须选择web版本,否则会出现Filter注册失败的问题。
2.2 核心配置类实现
创建ShiroConfig类时,这三个Bean是必须的:
java复制@Bean
public SecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(realm);
// 生产环境必须配置Session管理
manager.setSessionManager(sessionManager());
manager.setCacheManager(ehCacheManager());
return manager;
}
@Bean
public SessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setGlobalSessionTimeout(1800000);
