Spring Boot Shiro+JWT 最简单的整合方式 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
louislivi
V2EX    Java

Spring Boot Shiro+JWT 最简单的整合方式

  •  
  •   louislivi 2019-12-10 15:07:23 +08:00 3899 次点击
    这是一个创建于 2147 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    目前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 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其实很简单有兴趣可以去看看源码,这样的依赖集成是不是简单了很多呢?

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

    2 条回复    2019-12-11 13:54:26 +08:00
    Oktfolio
        1
    Oktfolio  
       2019-12-10 18:46:03 +08:00
    我更多用 Spring Security
    nxcdJaNnmyF9O90X
        2
    nxcdJaNnmyF9O90X  
       2019-12-11 13:54:26 +08:00
    老哥 不搞 swoole 啦
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2745 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 12:35 PVG 20:35 LAX 05:35 JFK 08:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86