Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Cloud中如何保证各个微服务之间调用的安全性

Spring Cloud中如何保证各个微服务之间调用的安全性

作者头像
猿天地
发布于 2018-07-25 09:34:33
发布于 2018-07-25 09:34:33
1.7K00
代码可运行
举报
文章被收录于专栏:猿天地猿天地
运行总次数:0
代码可运行

一.背景

微服务架构下,我们的系统根据业务被拆分成了多个职责单一的微服务。

每个服务都有自己的一套API提供给别的服务调用,那么如何保证安全性呢?

不是说你想调用就可以调用,一定要有认证机制,是我们内部服务发出的请求,才可以调用我们的接口。

需要注意的是我们这边讲的是微服务之间调用的安全认证,不是统一的在API官网认证,需求不一样,API网关处的统一认证是和业务挂钩的,我们这边是为了防止接口被别人随便调用。

二.方案

OAUTH2

Spring Cloud可以使用OAUTH2来实现多个微服务的统一认证授权

通过向OAUTH2服务进行集中认证和授权,获得access_token

而这个token是受其他微服务信任的,在后续的访问中都把access_token带过去,从而实现了微服务的统一认证授权。

JWT

JWT是一种安全标准。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息信息的合法性;如果验证成功,会产生并返回一个Token,用户可以使用这个token访问服务器上受保护的资源。

感觉这2种好像没多大区别呀,其实是有区别的:OAuth2是一种授权框架 ,JWT是一种认证协议

无论使用哪种方式切记用HTTPS来保证数据的安全性。

三.用哪种

我个人建议用JWT,轻量级,简单,适合分布式无状态的应用

用OAUTH2的话就麻烦点,各种角色,认证类型,客户端等等一大堆概念

四.怎么用

首先呢创建一个通用的认证服务,提供认证操作,认证成功后返回一个token

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
@RequestMapping(value="/oauth")
public class AuthController {
    @Autowired
    private AuthService authService;
    @PostMapping("/token")
    public ResponseData auth(@RequestBody AuthQuery query) throws Exception {
        if (StringUtils.isBlank(query.getAccessKey()) || StringUtils.isBlank(query.getSecretKey())) {
            return ResponseData.failByParam("accessKey and secretKey not null");
        }
        User user = authService.auth(query);
        if (user == null) {
            return ResponseData.failByParam("认证失败");
        }
        JWTUtils jwt = JWTUtils.getInstance();
        return ResponseData.ok(jwt.getToken(user.getId().toString()));
    }
    @GetMapping("/token")
    public ResponseData oauth(AuthQuery query) throws Exception {
        if (StringUtils.isBlank(query.getAccessKey()) || StringUtils.isBlank(query.getSecretKey())) {
            return ResponseData.failByParam("accessKey and secretKey not null");
        }
        User user = authService.auth(query);
        if (user == null) {
            return ResponseData.failByParam("认证失败");
        }
        JWTUtils jwt = JWTUtils.getInstance();
        return ResponseData.ok(jwt.getToken(user.getId().toString()));
    }
}

JWT可以加入依赖,然后写个工具类即可,建议写在全局的包中,所有的服务都要用,具体代码请参考:JWTUtils

GITHUB地址:https://github.com/jwtk/jjwt

JWT提供了很多加密的算法,我这边用的是RSA,目前是用的一套公钥以及私钥,这种做法目前来说是不好的,因为万一秘钥泄露了,那就谈不上安全了,所以后面会采用配置中心的方式来动态管理秘钥。

类里主要逻辑是生成token,然后提供一个检查token是否合法的方法,以及是否过期等等判断。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

统一认证的服务有了,我们只需要将认证服务注册到注册中心即可给别的服务消费。

那么我们如何使用刚刚的认证服务来做认证呢,最简单的办法就是用Filter来处理

比如说我现在有一个服务fangjia-fsh-house-service,之前是随便谁都能调用我提供的接口,现在我想加入验证,只有验证通过的才可以让它调用我的接口

那就在fangjia-fsh-house-service中加一个过滤器来判断是否有权限调用接口,我们从请求头中获取认证的token信息,不需要依赖Cookie

这个过滤器我也建议写在全局的项目中,因为也是所有服务都要用,代码请参考:HttpBasicAuthorizeFilter

主要逻辑就是获取token然后通过JWTUtils来验证是否合法,不合法给提示,合法则放过

这边需要注意的地方是解密的秘钥必须跟加密时是相同的,不然解密必然失败,就是bug了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//验证TOKEN
if (!StringUtils.hasText(auth)) {
    PrintWriter print = httpResponse.getWriter();
    print.write(JsonUtils.toJson(ResponseData.fail("非法请求【缺少Authorization信息】", 
                 ResponseCode.NO_AUTH_CODE.getCode())));
    return;
}
JWTUtils.JWTResult jwt = jwtUtils.checkToken(auth);
if (!jwt.isStatus()) {
    PrintWriter print = httpResponse.getWriter();
    print.write(JsonUtils.toJson(ResponseData.fail(jwt.getMsg(), jwt.getCode())));
    return;
}
chain.doFilter(httpRequest, response);

到这步为止,只要调用方在认证通过之后,通过认证服务返回的token,然后塞到请求头Authorization中,就可以调用其他需要认证的服务了。

这样看起来貌似很完美,但是用起来不方便呀,每次调用前都需要去认证,然后塞请求头,如何做到通用呢,不需要具体的开发人员去关心,对使用者透明,下篇文章,我们继续探讨如何实现方便的调用。

具体代码可以参考我的github:

https://github.com/yinjihuan/spring-cloud

推荐阅读:

《知识点-Spring Boot 统一异常处理汇总》

《Spring Boot 1.X和2.X优雅重启实战》

《Spring Boot中快速操作Mongodb》

《面试-线程池的成长之路》

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 猿天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Cloud中Feign如何统一设置验证token
代码地址:https://github.com/hbbliyong/springcloud.git
hbbliyong
2019/05/25
2.4K0
Spring Cloud中如何保证各个微服务之间调用的安全性(下篇)
今天我们继续接着上篇文章来聊一聊如何能够在调用方实现token的自动设置以及刷新。
猿天地
2018/07/25
7870
商城项目-授权中心
因为生成jwt,解析jwt这样的行为以后在其它微服务中也会用到,因此我们会抽取成工具。我们把鉴权中心进行聚合,一个工具module,一个提供服务的module
cwl_java
2020/01/14
6020
商城项目-授权中心
认证鉴权与API权限控制在微服务架构中的设计与实现(三)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第三篇,本文重点讲解token以及API级别的鉴权。本文对涉及到的大部分代码进行了分析,欢迎订阅本系列文章。 1. 前文回顾 在开始讲解这一篇文章之前,先对之前两篇文章进行回忆下。在第一篇 《认证鉴权与API权限控制在微服务架构中的设计与实现(一)》介绍了该项目的背景以及技术调研与最后选型。第二篇《认证鉴权与API权限控制在微服务架构中的设计与实现(二)》画出了简要的登录和校验的流程图,并重点讲解了用户身份的认证与token发放的具体
aoho求索
2018/04/03
2.6K0
认证鉴权与API权限控制在微服务架构中的设计与实现(三)
Spring Cloud 微服务(一) :概述
链路追踪中心,集中监控微服务系统中所有请求的执行路径。Sleuth 是侦探的意思。
安宁
2020/07/07
6650
Spring Cloud 微服务(一) :概述
Spring Cloud中Feign如何统一设置验证token
原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过去,这样被调用方通过验证token来判断是否合法请求。
猿天地
2018/07/25
2.5K0
认证鉴权与API权限控制在微服务架构中的设计与实现(一)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现。 1. 背景 最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安全权限方式,不能满足现有的微服务架构的认证与鉴权需求。微服务架构下,一个应用会被拆分成若干个微应用,每个微应用都需要对访问进行鉴权,每个微应用都需要明确当前访问用户以及其权限。尤其当访问来源不只是浏览器,还包括其他服务的调用时,单体应用架构下的鉴权方式就不是特别合适了
aoho求索
2018/04/03
3.3K0
认证鉴权与API权限控制在微服务架构中的设计与实现(一)
认证鉴权与API权限控制在微服务架构中的设计与实现(二)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第二篇,本文重点讲解用户身份的认证与token发放的具体实现。本文篇幅较长,对涉及到的大部分代码进行了分析,可收藏于闲暇时间阅读,欢迎订阅本系列文章。 1. 系统概览 在上一篇 《认证鉴权与API权限控制在微服务架构中的设计与实现(一)》介绍了该项目的背景以及技术调研与最后选型,并且对于最终实现的endpoint执行结果进行展示。对系统架构虽然有提到,但是并未列出详细流程图。在笔者的应用场景中,Auth系统与网关进行结合。在网关出配置
aoho求索
2018/04/03
1.7K0
认证鉴权与API权限控制在微服务架构中的设计与实现(二)
支持Nacos 2.1.0!这套Spring Cloud Gateway+Oauth2终极权限解决方案升级了!
在微服务系统中实现权限功能时,我们不应该把重复的权限校验功能集成到每个独立的API服务中去,而应该在网关做统一处理,然后通过认证中心去统一认证,这样才是优雅微服务权限解决方案!
macrozheng
2022/07/24
1.5K0
支持Nacos 2.1.0!这套Spring Cloud Gateway+Oauth2终极权限解决方案升级了!
基于Spring Cloud Oauth2 JWT搭建微服务的安全认证中心
Oauth协议为用户资源的授权提供了一个安全的、开放而又建议的标准。oauth的授权不会是第三方初级到用户的账号信息(如用户名与密码),及第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此oauth是安全的。oauth是Open Authorization的简写
小东啊
2019/06/26
15.8K1
基于Spring Cloud Oauth2 JWT搭建微服务的安全认证中心
Spring Cloud OAuth2 实现用户认证及单点登录
OAuth 2 有四种授权模式,分别是授权码模式(authorization code)、简化模式(implicit)、密码模式(resource owner password credentials)、客户端模式(client credentials),具体 OAuth2 是什么,可以参考这篇文章。(http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
古时的风筝
2019/10/24
2.1K0
Spring Cloud OAuth2 实现用户认证及单点登录
Spring Cloud Security实现微服务间的安全通信(一)
Spring Cloud Security是Spring Cloud生态系统的一个模块,它提供了基于OAuth2和JWT的安全认证和授权解决方案,支持在微服务架构中实现安全通信。在这篇文章中,我们将会探讨Spring Cloud Security的使用方法,并提供示例来帮助读者更好地了解如何在微服务中实现安全通信。
堕落飞鸟
2023/04/14
1.5K0
微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权!
https://github.com/macrozheng/springcloud-learning/tree/master/micro-oauth2
macrozheng
2020/07/14
25.6K1
微服务权限终极解决方案,Spring Cloud Gateway + Oauth2 实现统一认证和鉴权!
最近在做 Spring Cloud 项目,松哥和大家分享一点微服务架构中的安全管理思路
本文主要讲一些理论上的东西,所以要是前面的 OAuth2 不懂,可能阅读起来有些吃力:
江南一点雨
2020/04/24
1K0
基于 Spring Security OAuth2和 JWT 构建保护微服务系统
常见的应用场景如下图,用户通过浏览器进行登录,一旦确定用户名和密码正确,那么在服务器端使用秘钥创建 JWT,并且返回给浏览器;接下来我们的请求需要在头部增加 jwt 信息,服务器端进行解密获取用户信息,然后进行其他业务逻辑处理,再返回客户端
allsmallpig
2021/02/25
1.2K0
spring Cloud微服务 security+oauth2认证授权中心自定义令牌增强,并实现登录和退出
在之前的博客我写了 SpringCloud整合spring security+ oauth2+Redis实现认证授权,本文对返回的token实现自定义增强令牌返回结果,以及对于oauth2存在Redis的数据进行解释。
共饮一杯无
2022/11/28
1.2K0
spring Cloud微服务 security+oauth2认证授权中心自定义令牌增强,并实现登录和退出
Spring Cloud中Feign如何统一设置验证token
前面我们大致的聊了下如何保证各个微服务之前调用的认证问题 Spring Cloud中如何保证各个微服务之间调用的安全性 Spring Cloud中如何保证各个微服务之间调用的安全性(下篇) 原理是通过每个微服务请求之前都从认证服务获取认证之后的token,然后将token放入到请求头中带过去,这样被调用方通过验证token来判断是否合法请求 我们也在zuul中通过前置过滤器来统一设置token, 其实还漏掉了一种,那就是业务服务调用业务服务的时候,是没有zuul这种前置过滤器的,那么我们该如何设置呢? 其实
猿天地
2018/04/03
2.2K0
Spring Cloud中Feign如何统一设置验证token
微服务架构中整合网关、权限服务
前言:之前的文章有讲过微服务的权限系列和网关实现,都是孤立存在,本文将整合后端服务与网关、权限系统。安全权限部分的实现还讲解了基于前置验证的方式实现,但是由于与业务联系比较紧密,没有具体的示例。业务权限与业务联系非常密切,本次的整合项目将会把这部分的操作权限校验实现基于具体的业务服务。 1. 前文回顾与整合设计 在认证鉴权与API权限控制在微服务架构中的设计与实现系列文章中,讲解了在微服务架构中Auth系统的授权认证和鉴权。在微服务网关中,讲解了基于netflix-zuul组件实现的微服务网关。下面我们看一
aoho求索
2018/04/03
2.8K0
微服务架构中整合网关、权限服务
微服务权限
通过认证服务(oauth2-auth)进行统一认证,然后通过网关(oauth2-gateway)来统一校验认证和鉴权。采用Nacos作为注册中心,Gateway作为网关,使用nimbus-
花落花相惜
2021/12/07
7470
Spring Cloud Security:Oauth2实现单点登录
单点登录(Single Sign On)指的是当有多个系统需要登录时,用户只需登录一个系统,就可以访问其他需要登录的系统而无需登录。
macrozheng
2019/11/15
3.3K0
推荐阅读
相关推荐
Spring Cloud中Feign如何统一设置验证token
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验