簡介
目前
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.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
- 帶上token但是,
{
"msg": "Subject does not have permission [1]",
"code": 403
}
擴充
有時候需要自定義權限校驗以及錯誤傳回資訊結構等,這時候就需要重寫
FastDepShiroJwtAuthorization
類中的方法。更多詳情請看
這裡原理
使用
ImportBeanDefinitionRegistrar
BeanDefinitionBuilder.genericBeanDefinition
動态注入
Bean
其實很簡單有興趣可以去看看源碼,這樣的依賴內建是不是簡單了很多呢?
希望大家能夠支援開源,給個小星星,後續還會繼續開發其他依賴的整合,甚至相容其他架構使用。
fastdep
讓
java
整合依賴更簡單。在此也招募有志同道合的
coder
共同完善這個項目。