最近一直在码代码没怎么测试,今天一登录竟然发现登录都报错了。
报错代码CustomRealm.java 中的如下代码
Optional<Users> usersOptional = usersRepository.findByUserName(userName);
if(!usersOptional.isPresent()){
throw new AccountException("用户名不正确!");
}
报空指针,这代码能报空指针,心里一凉不会是bean都没注入进去吧,最近一直在写业务代码,@Autowired注解一直在使用不可能出什么问题,但是Realm类中出了问题第一想法肯定和shiro有关,可能是加载shiro的时候Realm这个类还没加载到。
嗯那我就手动让他在使用前加载进来就好了,实现ApplicationContextAware 重写setApplicationContext方法。
@Slf4j
@Component
public class ShiroConfig implements ApplicationContextAware {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setLoginUrl("/notLogin");//不配置的话,默认会写web下的login.jsp 或 /login
shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/guest/**", "anon");//游客开放权限
filterChainDefinitionMap.put("/user/**","roles[user]" );//用户需要user权限
filterChainDefinitionMap.put("/admin/**","roles[admin]" );//管理员需要 admin权限
//不用登录的接口
filterChainDefinitionMap.put("/register", "anon");//注册页面
filterChainDefinitionMap.put("/login", "anon");//登录页面
filterChainDefinitionMap.put("/sendMobileCode", "anon");//获取手机验证码
filterChainDefinitionMap.put("/getVerifyCode", "anon");//获取登录验证码
filterChainDefinitionMap.put("/index", "anon");//测试使用
filterChainDefinitionMap.put("/sina/notify", "anon");//异步回调
filterChainDefinitionMap.put("/bandingCard", "anon");//异步回调
filterChainDefinitionMap.put("/**", "authc");//该设置放最后,否则所有url都将被拦截
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
log.info("Shiro拦截器工厂类注入:{}", "成功");
return shiroFilterFactoryBean;
}
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(customRealm());
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
@Bean
public CustomRealm customRealm(){
return new CustomRealm();
}
/**
* Cookie 对象
* @return
*/
public SimpleCookie rememMeCookie(){
//初始化设置cookie的名称
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
simpleCookie.setMaxAge(2592000);//设置cookie的生效时间
return simpleCookie;
}
/**
* cookie 管理对象,记住我功能
* @return
*/
public CookieRememberMeManager rememberMeManager(){
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememMeCookie());
//remeberMe cookie 加密的密钥 各个项目不一样 默认AES算法 密钥长度(128 256 512)
cookieRememberMeManager.setCipherKey(Base64.getDecoder().decode(Constants.DECODER_STR));
return cookieRememberMeManager;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Realm userRealm = (Realm) applicationContext.getBean(CustomRealm.class);
DefaultWebSecurityManager defaultWebSecurityManager = (DefaultWebSecurityManager) applicationContext.getBean(SecurityManager.class);
defaultWebSecurityManager.setRealm(userRealm);
}
}
上面的代码重点下面这一段,加载进来后果然再跑代码就没毛病了。
@Slf4j
@Component
public class ShiroConfig implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Realm userRealm = (Realm) applicationContext.getBean(CustomRealm.class);
DefaultWebSecurityManager defaultWebSecurityManager = (DefaultWebSecurityManager) applicationContext.getBean(SecurityManager.class);
defaultWebSecurityManager.setRealm(userRealm);
}
}
不知道是不是记忆出了差错,感觉刚整合shiro的时候好像没有这个问题的,又想不起最近写的代码有哪里会影响这一块的代码(˘•ω•˘)