简介

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

源码地址

希望大家可以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

2.测试权限校验

  • 带token

  • 不带token

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

扩展

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

原理

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

希望大家能够支持开源,给个小星星,后续还会继续开发其他依赖的整合,甚至兼容其他框架使用。fastdepjava整合依赖更简单。在此也招募有志同道合的coder共同完善这个项目。

Spring Boot 最简单整合Shiro+JWT方式的更多相关文章

  1. Spring Boot入门 and Spring Boot与ActiveMQ整合

    1.Spring Boot入门 1.1什么是Spring Boot Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品.无 ...

  2. Spring Boot项目简单上手+swagger配置+项目发布(可能是史上最详细的)

    Spring Boot项目简单上手+swagger配置 1.项目实践 项目结构图 项目整体分为四部分:1.source code 2.sql-mapper 3.application.properti ...

  3. 转-Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合

    Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合 http://blog.csdn.net/balabalayi/article/detai ...

  4. Spring Boot 2.0 整合携程Apollo配置中心

    原文:https://www.jianshu.com/p/23d695af7e80 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够 ...

  5. Spring Boot 2.x 整合 Redis最佳实践

    一.前言 在前面的几篇文章中简单的总结了一下Redis相关的知识.本章主要讲解一下 Spring Boot 2.0 整合 Redis.Jedis 和 Lettuce 是 Java 操作 Redis 的 ...

  6. Spring Boot 2.x整合Redis

    最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...

  7. spring+springMVC+mybatis简单整合

    spring+springMVC+mybatis简单整合, springMVC框架是spring的子项目,所以框架的整合方式为,spring+Mybatis或springMVC+mybatis. 三大 ...

  8. RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ

    在上一篇随笔中我们认识并安装了RabbitMQ,接下来我们来看下怎么在Spring Boot 应用中整合RabbitMQ. 先给出最终目录结构: 搭建步骤如下: 新建maven工程amqp 修改pom ...

  9. Spring Boot配置过滤器的两种方式

    过滤器(Filter)是Servlet中常用的技术,可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,常用的场景有登录校验.权限控制.敏感词过滤等,下面介绍下Spring Boot配置过 ...

随机推荐

  1. 7.19 NOIP模拟6

    这次考试又一次让mikufun认识到了常数的重要性 T1.那一天我们许下约定 这题一看到D<=1e12,想都没想,矩阵快速幂!然后飞快的码了一个,复杂度n^3logD,让后我观察了一下这个转移矩 ...

  2. Kettle(6.0) 参数方式连接数据库

    数据库连接条件(视自己实际情况而定) 数据库: Oracle 主机名称(IP): localhost 或 127.0.0.1 数据库名称(SID):MYORCL 端口号: 1521 用户名: scot ...

  3. 通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战

    前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...

  4. 关于Python中的yield的理解

    生成器:yield表达式构成的函数就是生成器:每一个生成器都是一个迭代器(但是迭代器不一定是生成器).return就是迭代器: yield的功能类似于return,不同之处在于它返回的是生成器. 什么 ...

  5. js中call、apply和bind到底有什么区别?

    介绍 在js中,每个函数的原型都指向Function.prototype对象(js基于原型链的继承).因此,每个函数都会有apply,call,和bind方法,这些方法继承于Function. 它们的 ...

  6. AV时间戳dts,pts。从ffmpeg解码过程看过来。

    解码过程中,dts由媒体流读入的包推动(解码包中的dts标记),dts在前进.pts是在dts前进到某处(截点)而进行动作的标记. 物理时间自然流逝,dts可以被控制同步与物理时间同一脚步节奏,也可以 ...

  7. 视频抓取利器you-get

    本文链接:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序 ...

  8. three.js使用卷积法实现物体描边效果

    法线延展法 网上使用法线延展法实现物体描边效果的文章比较多,这里不再描述. 但是这种方法有个缺点:当两个面的法线夹角差别较大时,两个面的描边无法完美连接.如下图所示: 卷积法 这里使用另一种方法卷积法 ...

  9. java 学习第三天小练习

    今天做的是一些流程控制题,if...else,for循环等. 1.给定一个成绩,如果成绩大于80,则输出“奖励”.判断完后不管条件成不成立都要输出“继续努力”. package lianXiTi; i ...

  10. Openlayers Projection导致经纬度颠倒问题

    问题: openlayers3调用TileWMS接口,实现Openlayers加载Geoserver转发的ArcGIS切片时,web墨卡托(wkid3857)没有问题,但是WGS84(wkid4326 ...