(Java后台)集成shrio—引入出现的问题

2022-04-19  本文已影响0人  傻傻小萝卜

(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");

上一篇下一篇

猜你喜欢

热点阅读