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