(1)shiro 登录后不执行 doGetAuthorizationInfo
一开始以为只要,调用了doGetAuthenticationInfo就会马上调用doGetAuthorizationInfo,结果迟迟没有调用。通过百度了解到只有出现下边几种情况才会调用:
subject.hasRole(“admin”) 或 subject.isPermitted(“admin”):自己去调用这个是否有什么角色或者是否有什么权限的时候;
@RequiresRoles(“admin”) :在方法上加注解的时候;
[@shiro.hasPermission name = “admin”][/@shiro.hasPermission]:在页面上加shiro标签的时候,即进这个页面的时候扫描到有这个标签的时候。
@@RequiresPermissions("user:add") 在方法上的注解
首先建议使用subject.hasRole(“admin”) 或 subject.isPermitted(“admin”):放到请求的方法中,看看是否调用,如果这样写调用,但是通过注解的方式就不调用的话,需要查看ShiroConfig中的配置是否全,我这就是一直是注解不好使,最好将下边所有的方法都放进去
/**
* 解决:@RequiresPermissions导致控制器接口404
*/
@Bean
public DefaultAdvisorAutoProxyCreator proxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator =new DefaultAdvisorAutoProxyCreator();
proxyCreator.setUsePrefix(true);
return proxyCreator;
}
/**
* 开启shiro aop注解支持.否则@RequiresRoles等注解无法生效
* 使用代理方式;
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor =new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
/**
* Shiro生命周期处理器
* @return
*/
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
/**
* 自动创建代理
* @return
*/
@Bean
@DependsOn({"lifecycleBeanPostProcessor"})
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator =new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
}
(2)在TokenFilter中使用Redis的service获取登录用户的信息,service一直为null
经过查阅:web应用启动的顺序是:listener->filter->servlet
那就会发现我们自动注入的Service,此时还没有轮到他,但是在过滤器filter中已经使用了他;所以就爆了空指针;
解决方案:定义了一个类,
package cn.judouluo.shiro;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* shiro 自定义realm的认证阶段属于filter,当时的spring bean还没有读取进来
* 需要自己通过方法获取
*/
@Component
public class ApplicationContextUtilsimplements ApplicationContextAware {
private static ApplicationContextcontext =null;
public static T getBean(Class type) {
return context.getBean(type);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
if (ApplicationContextUtils.context ==null) {
ApplicationContextUtils.context = applicationContext;
}
}
}
通过这个类的方法,可以直接获取
// token过期
if (redisService ==null){
redisService = ApplicationContextUtils.getBean(UserInfoRedisService.class);
}
if (redisService.getUserByToken(token) ==null){
return JsonVos.raise(CodeMsg.TOKEN_EXPIRED);
}
(3)定义了ErrorController,在ErrorFilter中也进行了转发,但是就是进不去ErrorController就抛出异常,这个是最坑的,原因是在ShiroConfig中没有将错误的url进行屏蔽拦截,这个一定要小心
// 用户登录
urlMap.put("/user/login","anon");
// 将错误的打开
urlMap.put(ErrorFilter.ERROR_URI,"anon");
网友评论