SpringBoot中Shiro里进行 AuthorizationInfo授权时,会重复执行多次,是什么原因

如题,授权代码如下

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    log.info("正在对请求用户进行授权");
    String token = (String) principals.getPrimaryPrincipal();
    String openID = JwtUtil.getopenID(token);
    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    //获取相应的角色和权限,详情见getRoleAndPermission()
    RolePermission rolePermission = userService.getRoleAndPermission(openID);
    //添加角色
    log.info("【" + openID + "】" + "_添加角色_" + rolePermission.getRole());
    info.addRole(rolePermission.getRole());
    //添加权限
    try {
        JSONArray permissionArray = new JSONArray(rolePermission.getPermission());
        for (int i = 0; i < permissionArray.length(); i++) {
            log.info("正在添加权限:【"+permissionArray.getString(i)+"】");
            info.addStringPermission(permissionArray.getString(i));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return info;
}

控制台输出如下

clipboard.png

我是真没看懂为什么会这样,debug看值,没看出啥问题(不太会用2333),不晓得有没有遇到过的大佬知道这个是怎么回事,或者可能是怎么回事,感谢

阅读 11.3k
4 个回答

我网上找了很久,非正常情况下是这个问题,把下面这段代码注释后,就只会输出两次了,至于为什么还是会输出两次,请继续看

    /**
     * 开启后会重复执行doGetAuthorizationInfo
     */
//    @Bean
//    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
//        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
//        // 强制使用cglib,防止重复代理和可能引起代理出错的问题
//        // https://zhuanlan.zhihu.com/p/29161098
//        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
//        return defaultAdvisorAutoProxyCreator;
//    }

把上面这段注释后,还是是会输出两次的原因是(我的写法有问题),我后来改成了这种

 /** 授权,登录成功之后,进行角色的权限验证
     *  角色授权和对应权限添加
     *  只有当需要检测用户权限的时候采用调用此方法,例如checkRole,checkPermission之类的
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String token = (String) principals.getPrimaryPrincipal();
        String openID = JwtUtil.getopenID(token);
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        RolePermission rolePermission = userService.getRoleAndPermission(openID);
        //添加角色
        log.info("【" + openID + "】" + "_添加角色_" + rolePermission.getRole());
        info.addRole(rolePermission.getRole());
        //添加权限
        try {
            JSONArray permissionArray = new JSONArray(rolePermission.getPermission());
            for (int i = 0; i < permissionArray.length(); i++) {
                log.info("正在添加权限:【"+permissionArray.getString(i)+"】");
                info.addStringPermission(permissionArray.getString(i));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return info;
    }

但好像还是会触发两次,这次就不是代码问题了,先看注解

@RequiresRoles(value = {"root","admin"},logical = Logical.OR)

比如我这里是允许拥有身份为root或者admin的角色可操作,所以程序会执行两次,分别执行root,和admin,并不会因为第一个符合就不会执行第二个,所以输出了两次信息,如果有三个角色判断,就会输出三次,如上是我的结论

最近刚用过shiro,也不太熟。我猜是不是因为你shiro拦截的url被请求了多次,所以会有重复执行

新手上路,请多包涵

我的也这样.....不知道为什么

新手上路,请多包涵

把DefaultAdvisorAutoProxyCreator注释掉之后 shiro的注解就用不了了 会报404错误

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题