上一篇Spring Cloud Gateway的集成我們講解了如何集成Spring cloud gateway
本文源碼地址:
那麼接下來我們希望網關做爲入口能集成權限相關認證,具體的集成流程請參考:
集成權限模塊之後,一般的項目獲取當前登錄用戶的接口是調用比較頻繁的接口信息之一。這裏也體現使用JWT的方式的好處之一,部分用戶信息,已經緩存在token之中了。
基於上面的信息,我們可以從Security的上下文出發:
/**
* 獲取用戶token信息
* @return
*/
default Mono<JSONObject> getTokenInfo(){
Mono<JSONObject> baseUser = ReactiveSecurityContextHolder.getContext()
.switchIfEmpty(Mono.error(new IllegalStateException("ReactiveSecurityContext is empty")))
.map(SecurityContext::getAuthentication)
.map(Authentication::getPrincipal)
.map(jwt->{
Jwt jwtValue = null;
if(jwt instanceof Jwt){
jwtValue = (Jwt)jwt;
}
JSONObject tokenInfo = JSONObject.parseObject(JSONObject.toJSONString(jwtValue.getClaims()));
return tokenInfo;
});
return baseUser;
}
這樣獲取到的是整個JWT解碼之後的token信息。然後我們就可以通過token獲取到我們想要的用戶信息了。
/**
* 獲取用戶信息
* @return
*/
default Mono<BaseUser> getUserInfo(){
return getTokenInfo().map(token->token.getJSONObject(Constant.USER_INFO).toJavaObject(BaseUser.class));
}
當然通常情況下爲了權限控制,我們在獲取用戶的同時需要得到整個用戶的權限信息,所以最終的接口成型爲:
@Override
public Mono<UserResponse> getUserInfoByAccess() {
Mono<JSONObject> tokenInfo = getTokenInfo();
return tokenInfo.map(token->{
UserResponse userResponse = new UserResponse();
BaseUser baseUser = token.getJSONObject(Constant.USER_INFO).toJavaObject(BaseUser.class);
userResponse.setBaseUser(baseUser);
JSONArray array = token.getJSONArray("authorities");
//查詢全部的權限
List<Permission> result = permissionUtil.getResultPermission(array);
if(!CollectionUtils.isEmpty(result)) {
userResponse.setAccess(result.stream().map(Permission::getAuthCode).collect(Collectors.toList()));
}
return userResponse;
});
}