在使用 apache Shiro 进行身份验证和授权时,如果遇到shirofilter
报错,这可能涉及多个方面的问题,以下是一些常见的原因及其解决方法:
常见错误及解决方案

1.依赖问题
Shiro 需要与 Spring 框架集成,因此确保所有必要的依赖都已正确添加。
- <dependency>
- <groupId>org.apache.shiro</groupId>
- <artifactId>shirospring</artifactId>
- <version>1.7.1</version>
- </dependency>
2.配置错误
检查你的 Shiro 配置是否正确,尤其是shiro.ini
或 Spring 的 java 配置类。
shiro.ini 示例:
- [main]
- 配置 SecurityManager
- securityManager = org.apache.shiro.mgt.DefaultSecurityManager
- securityManager.realm = jdbcRealm
- securityManager.cacheManager = cacheManager
- 配置 Realm
- jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
- jdbcRealm.dataSource = dataSource
- jdbcRealm.permissionsQuery = SELECT * FROM permissions WHERE username = ? AND permission = ?
- 配置缓存管理器
- cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager
- cacheManager.cacheManagerConfigFile = classpath:ehcache.xml
- 配置数据源
- dataSource = org.apache.commons.dbcp2.BasicDataSource
- dataSource.driverClassName = com.mysql.jdbc.Driver
- dataSource.url = jdbc:mysql://localhost:3306/mydatabase
- dataSource.username = root
- dataSource.password = password
Spring Java 配置示例:

- @Bean
- public DefaultSecurityManager securityManager(Realm realm) {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- securityManager.setRealm(realm);
- return securityManager;
- }
- @Bean
- public Realm realm() {
- SimpleAccountRealm realm = new SimpleAccountRealm();
- realm.addAccount("user", "password", "user", "admin");
- return realm;
- }
3.Filter 配置错误
确保你在 web.xml 或 Spring Boot 的配置文件中正确配置了 Shiro 的过滤器。
web.xml 示例:
- <filter>
- <filtername>shiroFilter</filtername>
- <filterclass>org.springframework.web.filter.DelegatingFilterProxy</filterclass>
- <initparam>
- <paramname>targetFilterLifecycle</paramname>
- <paramvalue>true</paramvalue>
- </initparam>
- </filter>
- <filtermapping>
- <filtername>shiroFilter</filtername>
- <urlpattern>/*</urlpattern>
- <dispatcher>REQUEST</dispatcher>
- <dispatcher>FORWARD</dispatcher>
- </filtermapping>
Spring Boot 示例:
- @Bean
- public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
- ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
- shiroFilter.setSecurityManager(securityManager);
- Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
- filterChainDefinitionMap.put("/login", "anon");
- filterChainDefinitionMap.put("/**", "authc");
- shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
- return shiroFilter;
- }
4.权限配置错误
确保用户拥有执行特定操作的权限,在jdbcRealm
中,确保数据库中有正确的权限记录。

5.调试日志
启用 Shiro 的调试日志以获取更多详细信息:
- log4j.logger.org.apache.shiro=DEBUG
常见问题解答 (FAQs)
Q1: Shiro 报 "No Realm currently configured for one or more InjectionPoints" 错误怎么办?
A1: 这个错误通常意味着在你的 Shiro 配置中没有设置任何 Realm,确保你已经正确配置了一个 Realm,并且该 Realm 已经添加到 SecurityManager 中。
- DefaultSecurityManager securityManager = new DefaultSecurityManager();
- securityManager.setRealm(new SimpleAccountRealm()); // 确保设置了 Realm
Q2: Shiro 报 "Subject does not have the specified permission" 错误怎么办?
A2: 这表明当前用户没有足够的权限来执行请求的操作,确保用户具有所需的权限,并且这些权限已在 Realm 中正确配置,如果是使用 JdbcRealm,确保数据库中的权限记录是正确的。
- INSERT INTO permissions (username, permission) VALUES ('user', 'read');
通过仔细检查上述几个方面的配置,你应该能够解决大部分与 Shiro 相关的问题,如果问题仍然存在,建议查看完整的堆栈跟踪信息,并根据具体的错误消息进一步排查。