在使用 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 相关的问题,如果问题仍然存在,建议查看完整的堆栈跟踪信息,并根据具体的错误消息进一步排查。
