目前RESTful
大多都採用JWT
來作受權校驗,在Spring Boot
中能夠採用Shiro
和JWT
來作簡單的權限以及認證驗證,在和Spring Boot
集成的過程當中碰到了很多坑。便結合自身以及你們的經常使用的運用場景開發出了這個最簡單的整合方式fastdep-shiro-jwt
。git
但願你們能夠star支持一下,後續還會加入其它依賴的簡易整合。
https://github.com/louislivi/fastdepgithub
Maven
<dependency> <groupId>com.louislivi.fastdep</groupId> <artifactId>fastdep-shiro-jwt</artifactId> <version>1.0.2</version> </dependency>
Gradle
app
# 配置文件 - `application.yml`
fastdep:ide
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 {ui
@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; }
}3d
# 運用
@RestController
public class TestController {code
@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!"; }
}xml
# 測試 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
{jwt
"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`其實很簡單有興趣能夠去看看源碼,這樣的依賴集成是否是簡單了不少呢?