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

2019-12-10 16:02:01来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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

简介

目前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共同完善这个项目。


原文链接:https://www.cnblogs.com/muzishanhe/p/12015410.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java连载59-局部内部类、匿名内部类

下一篇:小白的springboot之路(八)、继承Redis以及@Cacheable注解实现R