转载

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

# 配置文件

- `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](https://upload-images.jianshu.io/upload_images/6411787-2a224617bd3d0783.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.测试权限校验
- 带token
![hasToken.png](https://upload-images.jianshu.io/upload_images/6411787-7143535ef3b2edea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 不带token

{

"msg": "Access denied !",
 "code": 401

}

- 带上token但是,`SimpleAuthorizationInfo`中无指定权限

{

"msg": "Subject does not have permission [1]",
"code": 403

}

> 扩展

有时候需要自定义权限校验以及错误返回信息结构等,这时候就需要重写`FastDepShiroJwtAuthorization`类中的方法。更多详情请看[这里](https://fastdep.louislivi.com/#/module/fastdep-shiro-jwt)

#### 原理

使用`ImportBeanDefinitionRegistrar` `BeanDefinitionBuilder.genericBeanDefinition`动态注入`Bean`其实很简单有兴趣可以去看看源码,这样的依赖集成是不是简单了很多呢?
原文  https://segmentfault.com/a/1190000021264451
正文到此结束
Loading...