美文网首页
(Java后台)集成shrio—引入出现的问题

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

作者: 傻傻小萝卜 | 来源:发表于2022-04-19 16:17 被阅读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");

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/djwsertx.html