Spring Cloud微服务项目搭建系列文章(九):Spring Cloud gateway集成Spring Cloud Security、Oauth2获取当前登录用户

上一篇Spring Cloud Gateway的集成我们讲解了如何集成Spring cloud gateway

本文源码地址:

源码地址

那么接下来我们希望网关做为入口能集成权限相关认证,具体的集成流程请参考:

Spring Cloud Gateway实现权限控制

集成权限模块之后,一般的项目获取当前登录用户的接口是调用比较频繁的接口信息之一。这里也体现使用JWT的方式的好处之一,部分用户信息,已经缓存在token之中了。

基于上面的信息,我们可以从Security的上下文出发:

    /**
     * 获取用户token信息
     * @return
     */
    default Mono getTokenInfo(){
        Mono 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 getUserInfo(){
        return getTokenInfo().map(token->token.getJSONObject(Constant.USER_INFO).toJavaObject(BaseUser.class));
    }

当然通常情况下为了权限控制,我们在获取用户的同时需要得到整个用户的权限信息,所以最终的接口成型为:

    @Override
    public Mono getUserInfoByAccess() {
        Mono 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 result = permissionUtil.getResultPermission(array);
            if(!CollectionUtils.isEmpty(result)) {
                userResponse.setAccess(result.stream().map(Permission::getAuthCode).collect(Collectors.toList()));
            }
            return userResponse;
        });
    }

 

你可能感兴趣的:(spring,cloud)