踩坑记录
springboot整合shiro之后,测试登录报错【org.apache.shiro.authc.UnknownAccountException】
登录成功与否都报错。
错误原因
找了别人的博客都不行,自己debug走排坑。发现登录的时候Realm
的认证方法走了两次。
等于说登录方法被拦截了,登陆之前走了一次,登录的时候又走了一次
登录之前走的Realm认证方法,里面token啥都没有或者已经过期了,所有拿不到东西,拿不到东西数据库就查不到数据,那你的user类就是null,就会报这个错
解决方法
shiro配置的时候,排出你的登录接口,如下。
在你配置的地方,添加filterRuleMap.put("/common/login", "anon");
/common/login
是你的登录接口
//配置拦截器
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
/**
*添加Shiro内置过滤器
* 常用的过滤器:
* anon:无需认证(登录)可以访问
* authc:必须认证才可以访问
* user:如果使用rememberMe的功能可以直接访问
* perms:该资源必须得到资源权限才可以访问
* role:该资源必须得到角色权限才可以访问
*/
Map<String, Filter> filterMap = new HashMap<>();
filterMap.put("jwt", new JWTFilter());
filterMap.put("corsAuthenticationFilter", corsAuthenticationFilter());
shiroFilterFactoryBean.setFilters(filterMap);
Map<String, String> filterRuleMap = new HashMap<>();
filterRuleMap.put("/**", "jwt");
filterRuleMap.put("/common/login", "anon"); //放行登录接口
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterRuleMap);
return shiroFilterFactoryBean;
}
另外:如果需要spring boot 整合shiro的配置,可以参考我的仓库:springboot 整合shiro配置仓库
里面的登录接口和认证 授权方法需要自己修改