jeecg-boot的shiro认证过程

本文档详细介绍了Jeecg-Boot中Shiro的配置过程,包括配置拦截路径、JWTFilter、自定义Realm以及相关Bean的初始化。通过配置ShiroFilter,设置了一系列无需权限验证的URL,并定义了自定义过滤器JWTFilter,用于接口登录验证。同时,文中还提到了Shiro的安全管理器配置和Realm的实现,确保系统认证的正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. shrio配置

说明:

  • 首先配置一系列拦截的路径
  • 配置jwtfilter 继承AuthenticatingFilter 作后面的接口登录验证
  • 自定义realm
  • 实例化常规bean

 

 

  1. package com.hnlrkj.talentgift.config.shiro;

    import
    com.hnlrkj.talentgift.config.shiro.filters.CustomShiroFilterFactoryBean;
    import
    com.hnlrkj.talentgift.config.shiro.filters.JwtFilter;
    import
    com.hnlrkj.talentgift.common.constant.CommonConstant;
    import
    com.hnlrkj.talentgift.common.util.oConvertUtils;
    import
    lombok.extern.slf4j.Slf4j;
    import
    org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
    import
    org.apache.shiro.mgt.DefaultSubjectDAO;
    import
    org.apache.shiro.mgt.SecurityManager;
    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.crazycake.shiro.IRedisManager;
    import
    org.crazycake.shiro.RedisCacheManager;
    import
    org.crazycake.shiro.RedisClusterManager;
    import
    org.crazycake.shiro.RedisManager;

    import
    org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
    import
    org.springframework.beans.factory.annotation.Autowired;
    import
    org.springframework.beans.factory.annotation.Value;
    import
    org.springframework.context.annotation.Bean;
    import
    org.springframework.context.annotation.Configuration;
    import
    org.springframework.context.annotation.DependsOn;
    import
    org.springframework.core.env.Environment;
    import
    org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
    import
    org.springframework.util.StringUtils;
    import
    redis.clients.jedis.HostAndPort;
    import
    redis.clients.jedis.JedisCluster;

    import
    javax.annotation.Resource;
    import
    javax.servlet.Filter;
    import
    java.util.*;

    /**
     * @author:
     
    * @date:
     
    * @description: shiro
    配置类
     
    */

    @Slf4j
    @Configuration

    public class ShiroConfig {

       
    @Value("${talentgift.shiro.excludeUrls}")
       
    private String excludeUrls;
       
    @Resource
       
    LettuceConnectionFactory lettuceConnectionFactory;
       
    @Autowired
       
    private Environment env;


       
    /**
         * Filter Chain
    定义说明
        
    *
         * 1
    、一个URL可以配置多个Filter,使用逗号分隔
        
    * 2、当设置多个过滤器时,全部验证通过,才视为通过
        
    * 3、部分过滤器可指定参数,如permsroles
         */
       
    @Bean("shiroFilter")
       
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
            CustomShiroFilterFactoryBean shiroFilterFactoryBean =
    new CustomShiroFilterFactoryBean();
           
    shiroFilterFactoryBean.setSecurityManager(securityManager);
           
    // 拦截器
           
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
            if
    (oConvertUtils.isNotEmpty(excludeUrls)){
                String[] permissionUrl =
    excludeUrls.split(",");
                for
    (String url : permissionUrl){
                    filterChainDefinitionMap.put(url
    ,"anon");
               
    }
            }

           
    // 配置不会被拦截的链接 顺序判断
           
    filterChainDefinitionMap.put("/sys/cas/client/validateLogin", "anon"); //cas验证登录
           
    filterChainDefinitionMap.put("/sys/randomImage/**", "anon"); //登录验证码接口排除
           
    filterChainDefinitionMap.put("/sys/checkCaptcha", "anon"); //登录验证码接口排除
           
    filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除
           
    filterChainDefinitionMap.put("/sys/mLogin", "anon"); //登录接口排除
           
    filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除
           
    filterChainDefinitionMap.put("/sys/thirdLogin/**", "anon"); //第三方登录
           
    filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串
           
    filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码
           
    filterChainDefinitionMap.put("/sys/phoneLogin", "anon");//手机登录
           
    filterChainDefinitionMap.put("/sys/user/checkOnlyUser", "anon");//校验用户是否存在
           
    filterChainDefinitionMap.put("/sys/user/register", "anon");//用户注册
           
    filterChainDefinitionMap.put("/sys/user/querySysUser", "anon");//根据手机号获取用户信息
           
    filterChainDefinitionMap.put("/sys/user/phoneVerification", "anon");//用户忘记密码验证手机号
           
    filterChainDefinitionMap.put("/sys/user/passwordChange", "anon");//用户更改密码
           
    filterChainDefinitionMap.put("/auth/2step-code", "anon");//登录验证码
           
    filterChainDefinitionMap.put("/sys/common/static/**", "anon");//图片预览 &下载文件不限制token
           
    filterChainDefinitionMap.put("/sys/common/pdf/**", "anon");//pdf预览
           
    filterChainDefinitionMap.put("/generic/**", "anon");//pdf预览需要文件
           
    filterChainDefinitionMap.put("/", "anon");
           
    filterChainDefinitionMap.put("/doc.html", "anon");
           
    filterChainDefinitionMap.put("/**/*.js", "anon");
           
    filterChainDefinitionMap.put("/**/*.css", "anon");
           
    filterChainDefinitionMap.put("/**/*.html", "anon");
           
    filterChainDefinitionMap.put("/**/*.svg", "anon");
           
    filterChainDefinitionMap.put("/**/*.pdf", "anon");
           
    filterChainDefinitionMap.put("/**/*.jpg", "anon");
           
    filterChainDefinitionMap.put("/**/*.png", "anon");
           
    filterChainDefinitionMap.put("/**/*.ico", "anon");

           
    filterChainDefinitionMap.put("/**/*.ttf", "anon");
           
    filterChainDefinitionMap.put("/**/*.woff", "anon");
           
    filterChainDefinitionMap.put("/**/*.woff2", "anon");

           
    filterChainDefinitionMap.put("/druid/**", "anon");
           
    filterChainDefinitionMap.put("/swagger-ui.html", "anon");
           
    filterChainDefinitionMap.put("/swagger**/**", "anon");
           
    filterChainDefinitionMap.put("/webjars/**", "anon");
           
    filterChainDefinitionMap.put("/v2/**", "anon");

           
    //积木报表排除
           
    filterChainDefinitionMap.put("/jmreport/**", "anon");
           
    filterChainDefinitionMap.put("/**/*.js.map", "anon");
           
    filterChainDefinitionMap.put("/**/*.css.map", "anon");
           
    //大屏设计器排除
           
    filterChainDefinitionMap.put("/bigscreen/**", "anon");

           
    //测试示例
           
    filterChainDefinitionMap.put("/test/bigScreen/**", "anon"); //大屏模板例子
           
    //filterChainDefinitionMap.put("/test/jeecgDemo/rabbitMqClientTest/**", "anon"); //MQ测试
           
    //filterChainDefinitionMap.put("/test/jeecgDemo/html", "anon"); //模板页面
           
    //filterChainDefinitionMap.put("/test/jeecgDemo/redis/**", "anon"); //redis测试

           
    //websocket排除
           
    filterChainDefinitionMap.put("/websocket/**", "anon");//系统通知和公告
           
    filterChainDefinitionMap.put("/newsWebsocket/**", "anon");//CMS模块
           
    filterChainDefinitionMap.put("/vxeSocket/**", "anon");//JVxeTable无痕刷新示例
           
    filterChainDefinitionMap.put("/eoaSocket/**","anon");//我的聊天

           
    //性能监控  TODO 存在安全漏洞泄露TOEKNdurid连接池也有)
           
    filterChainDefinitionMap.put("/actuator/**", "anon");

           
    // 添加自己的过滤器并且取名为jwt
           
    Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
           
    //如果cloudServer为空 则说明是单体 需要加载跨域配置
           
    Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);
           
    filterMap.put("jwt", new JwtFilter(cloudServer==null));
           
    shiroFilterFactoryBean.setFilters(filterMap);
           
    // <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边
           
    filterChainDefinitionMap.put("/**", "jwt");

           
    // 未授权界面返回JSON
           
    shiroFilterFactoryBean.setUnauthorizedUrl("/sys/common/403");
           
    shiroFilterFactoryBean.setLoginUrl("/sys/common/403");
           
    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
            return
    shiroFilterFactoryBean;
       
### Jeecg-Boot 框架介绍 Jeecg-Boot 是一款基于 Spring Boot 和代码生成器的快速开发平台[^3]。该框架采用了前后端分离架构,集成了多个流行的技术栈: - 后端技术:Spring Boot, MyBatis, Shiro, JWT - 前端技术:Vue & Ant Design 通过这些集成,Jeecg-Boot 提供了一个完整的解决方案来加速企业级应用的开发过程。 #### 主要特点 1. **强大的代码生成功能** 使用内置的代码生成工具可以自动生成前端页面以及后端接口,极大地减少了手动编码的工作量。 2. **全面的安全机制** 集成 Apache Shiro 或其他安全组件实现用户认证授权管理,保障系统的安全性。 3. **灵活的数据访问层支持** 支持多种数据库连接方式,并且可以通过简单的配置完成数据源切换操作。 4. **丰富的插件生态** 提供了一系列开箱即用的功能模块(如定时任务调度、文件上传下载等),满足不同场景下的需求。 5. **易于扩展维护** 整体设计遵循微服务理念,在不影响现有业务的前提下方便后续功能迭代升级。 --- ### 使用教程概览 为了帮助开发者更好地理解和掌握 Jeecg-Boot 的核心概念及其实际应用场景,下面将给出一个简化的入门指南。 #### 准备工作 确保本地环境已经安装并配置好了 Java JDK 8 及以上版本、Maven 构建工具和 Git 版本控制系统。 #### 获取项目源码 可以从官方 GitHub 仓库克隆最新的稳定版分支到本地机器上进行学习研究: ```bash git clone https://github.com/jeecgboot/jeecg-boot.git cd jeecg-boot ``` #### 修改配置文件 首次启动前建议先调整 `src/main/resources/application-dev.yml` 中的相关参数以适配个人开发环境的要求[^2]: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` > 注意替换上述示例中的数据库地址、用户名密码等内容为你自己的 MySQL 实例信息。 #### 运行应用程序 执行 Maven 命令编译打包整个工程结构并将最终产物部署至内嵌 Tomcat 容器中运行起来: ```bash mvn clean spring-boot:run -Dspring.profiles.active=dev ``` 此时应该可以在浏览器里输入 http://localhost:8765 访问默认首页界面了。 #### 探索更多特性 随着对基础部分熟悉程度加深之后就可以尝试探索诸如 Swagger API 文档生成、Lombok 注解简化实体类定义等功能点[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值