簡介
目前RESTful大多都采用JWT來做授權校驗,在Spring Boot 中可以采用Shiro和JWT來做簡單的權限以及認證驗證,在和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.ymlfastdep: 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其實很簡單有興趣可以去看看源碼,這樣的依賴集成是不是簡單了很多呢?
希望大家能夠支持開源,給個小星星,后續還會繼續開發其他依賴的整合,甚至兼容其他框架使用。fastdep讓java整合依賴更簡單。在此也招募有志同道合的coder共同完善這個項目。
