• 如何用Spring Boot整合Shiro+JWT?这里教大家一最最简单的方式


    简介

    目前 RESTful 大多都采用 JWT 来做授权校验,在 Spring Boot 中可以采用 Shiro 和 JWT 来做简单的权限以及认证验证,在和 Spring Boot 集成的过程中碰到了不少坑。便结合自身以及大家的常用的运用场景开发出了这个最简单的整合方式 fastdep-shiro-jwt

    这里还要注意:光理论是不够的,在此送大家十套2020最新Java架构实战教程+大厂面试题库,进我扣裙 :七吧伞吧零而衣零伞 (数字的谐音)转换下可以找到了,里面很多新JAVA架构项目教程,还可以跟老司机交流讨教! 

    源码地址

    希望大家可以 star 支持一下,后续还会加入其它依赖的简易整合。
    https://github.com/louislivi/fastdep

     

    引入依赖

    • Maven
      <dependency>
      <groupId>com.louislivi.fastdep</groupId>
      <artifactId>fastdep-shiro-jwt</artifactId>
      <version>1.0.2</version>
      </dependency>
    • Gradle
      compile group: 'com.louislivi.fastdep', name: 'fastdep-redis', version: '1.0.2'
     

    配置文件

    • application.yml

      fastdep:
      shiro-jwt:
        filter: #shiro过滤规则
          admin:
            path: /admin/**
            role: jwt # jwt为需要进行token校验
          front:
            path: /front/**/**
            role: anon # anon为无需校验
        secret: "6Dx8SIuaHXJYnpsG18SSpjPs50lZcT52" # jwt秘钥
      #    expireTime: 7200000 # token有效期
      #    prefix: "Bearer "  # token校验时的前缀
      #    signPrefix: "Bearer " # token生成签名的前缀
      #    header: "Authorization" # token校验时的header头
      #    以下对应为shiro配置参数,无特殊需求无需配置
      #    loginUrl: 
      #    successUrl: 
      #    unauthorizedUrl: 
      #    filterChainDefinitions: 
    • 用户权限配置类

      @Component
      public class FastDepShiroJwtConfig extends FastDepShiroJwtAuthorization {
      
      @Autowired
      private UserRequestDataMapper userRequestDataMapper;
      
      @Override
      public SimpleAuthorizationInfo getAuthorizationInfo(String userId) {
          // 查询该用户下的所有权限(当前为示例仅查询用户ID真实环境替换为用户的权限值)
          Set<String> collect = userRequestDataMapper.selectOptions().stream().map(u -> u.getUserId().toString()).collect(Collectors.toSet());
            SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
            System.out.println(collect);
            // 当前值为 [1]
            // 添加用户权限到SimpleAuthorizationInfo中
            simpleAuthorizationInfo.addStringPermissions(collect);
            return simpleAuthorizationInfo;
        }
      }
     

    运用

    @RestController
    public class TestController {
        @Autowired
        private JwtUtil jwtUtil;
    
        /**
         * 当前为示例所以直接返回了token,真实环境为校验登录信息后再返回token即可
         * @author : louislivi
         */
        @GetMapping("front/login")
        public String login() {
            // ...校验登录信息是否正确
            // 传入用户唯一标示
            return jwtUtil.sign("1"); 
        }
    
        /**
         * 当前为示例所以权限写的是用户ID 真实环境替换为权限key
         * @author : louislivi
         */
        @GetMapping("admin")
        @RequiresPermissions("1")
        public String jwt() {
            return "ok!";
        }
    }
     

    测试

    1. 获取 token

    front-login.png
     

    2. 测试权限校验

    • 带 token

      hasToken.png
       
    • 不带 token

      {
       "msg": "Access denied !",
       "code": 401
      }
      • 带上 token 但是,SimpleAuthorizationInfo 中无指定权限
        {
        "msg": "Subject does not have permission [1]",
        "code": 403
        }

        扩展

    有时候需要自定义权限校验以及错误返回信息结构等,这时候就需要重写 FastDepShiroJwtAuthorization 类中的方法。更多详情请看这里

     

    原理

    使用 ImportBeanDefinitionRegistrar BeanDefinitionBuilder.genericBeanDefinition 动态注入 Bean 其实很简单有兴趣可以去看看源码,这样的依赖集成是不是简单了很多呢?

    希望大家能够支持开源,给个小星星,后续还会继续开发其他依赖的整合,甚至兼容其他框架使用。fastdep 让 java 整合依赖更简单。在此也招募有志同道合的 coder 共同完善这个项目。
    最后注意:光理论是不够的,在此送大家十套2020最新Java架构实战教程+大厂面试题库,进我扣裙 :七吧伞吧零而衣零伞 (数字的谐音)转换下可以找到了,里面很多新JAVA架构项目教程,还可以跟老司机交流讨教! 
    本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

  • 相关阅读:
    zoj 3693, 卡精度
    zoj 3690, 计数 dp , 快速幂
    hdu 1496,枚举
    zoj 2399, 哈弗曼编码
    poj 2560,mst
    poj 2007, 乱搞,计算几何
    bnu 29064, 期望 水题
    img,bg
    垂直居中,定位的方法
    .reverse ,join,split区分
  • 原文地址:https://www.cnblogs.com/chengxuyuanaa/p/12884776.html
Copyright © 2020-2023  润新知