86822 2021-12-06 18:16 采纳率: 0%
浏览 31
已结题

springboot整合shiro 整合jwt 报类型转换异常

 @PostMapping("/register")
    @RequiresPermissions(value = {"user.register"},logical = Logical.OR)
    public ResponseBean add(@RequestBody @Valid AddUserReqVo vo) {
        User add = userService.add(vo);
        if (ObjectUtils.isNull(add)) {
            return ResponseBean.setResponseMessage(Const.FAILED_CODE, Const.REQUEST_FAILED, Const.USER_ERROR_USERNAME);
        }
        Map<String, Object> data = new HashMap<>();
        if (add != null) {
            data.put("userId", add.getUserId());
            return ResponseBean.setResponseMessage(Const.SUCCESS_CODE, Const.REQUEST_SUCCESS, data);
        }
        return ResponseBean.setResponseMessage(Const.FAILED_CODE, Const.USER_ERROR_USERNAME, vo.getUsername());
    }

```java
{
    "message": "java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class org.apache.shiro.authz.AuthorizationInfo (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; org.apache.shiro.authz.AuthorizationInfo is in unnamed module of loader 'app'): class java.util.LinkedHashMap cannot be cast to class org.apache.shiro.authz.AuthorizationInfo (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; org.apache.shiro.authz.AuthorizationInfo is in unnamed module of loader 'app')",
    "code": 500,
    "data": null
}


package com.fahuobang.shiro.config;

import com.fahuobang.common.cache.CustomCacheManager;
import com.fahuobang.shiro.jwt.JwtFilter;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
import org.apache.shiro.mgt.DefaultSubjectDAO;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;

import javax.servlet.Filter;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * shiro配置类
 */

@Slf4j
@Configuration
public class ShiroConfig {

    @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
    @Bean("securityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(UserRealm userRealm) {
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        // 使用自定义Realm
        defaultWebSecurityManager.setRealm(userRealm);
        // 关闭Shiro自带的session
        DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
        DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
        defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
        subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
        defaultWebSecurityManager.setSubjectDAO(subjectDAO);
        // 设置自定义Cache缓存
        defaultWebSecurityManager.setCacheManager(new CustomCacheManager());
        return defaultWebSecurityManager;
    }
    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        // 添加自己的过滤器取名为jwt
        Map<String, Filter> filterMap = new HashMap<>(16);
        filterMap.put("jwt", new JwtFilter());
        factoryBean.setFilters(filterMap);
        factoryBean.setSecurityManager(securityManager);
        // 自定义url规则使用LinkedHashMap有序Map
        LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(16);
        // 登录接口放开
        map.put("/user/login", "anon");
        map.put("/logout","logout");
        // 所有请求通过我们自己的JWTFilter
        map.put("/**", "jwt");
        factoryBean.setFilterChainDefinitionMap(map);
        return factoryBean;
    }

    /**
     * 下面的代码是添加注解支持
     */
    @Bean
    @DependsOn("lifecycleBeanPostProcessor")
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
        // 强制使用cglib,防止重复代理和可能引起代理出错的问题,https://zhuanlan.zhihu.com/p/29161098
        defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
        return defaultAdvisorAutoProxyCreator;
    }

//    java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to
//    class org.apache.shiro.authz.AuthorizationInfo (java.util.LinkedHashMap is in module java.base of
//    loader 'bootstrap'; org.apache.shiro.authz.AuthorizationInfo is in unnamed module of loader 'app'):
//    class java.util.LinkedHashMap cannot be cast to class org.apache.shiro.authz.AuthorizationInfo (java.util.LinkedHashMap is
//    in module java.base of loader 'bootstrap'; org.apache.shiro.authz.AuthorizationInfo is in unnamed module of loader 'app

    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
        advisor.setSecurityManager(securityManager);
        return advisor;
    }

}

```

  • 写回答

1条回答 默认 最新

  • 86822 2021-12-06 18:17
    关注

    只要加上shiro的权限注解,请求接口的时候就报这个类型转换异常,这是什么原因?

    评论

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 创建了问题 12月6日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真