【实战】Spring Cloud Gateway 整合 OAuth2

新建一个oauth2-cloud-auth-server模块,目录如下:

用于从数据库中加载用户,如下:

为了演示只是模拟了从数据库中查询,其中存了两个用户,如下:

  • user:具有ROLE_user权限

  • admin:具有ROLE_admin、ROLE_user权限

要想这个生效,还要在security的配置文件SecurityConfig中指定,如下图:

另外还整合了注册中心Nacos,详细配置就不贴了,可以看源码

网关服务搭建


网关使用的是Spring Cloud Gateway

新建一个oauth2-cloud-gateway模块,目录如下图:

1、添加依赖

需要添加几个OAuth2.0相关的依赖,如下:

2、JWT令牌服务配置

使用JWT令牌,配置要和认证服务的令牌配置相同,代码如下:

3、认证管理器自定义

新建一个JwtAuthenticationManager,需要实现ReactiveAuthenticationManager这个接口。

认证管理的作用就是获取传递过来的令牌,对其进行解析验签过期时间判定。

详细代码如下:

逻辑很简单,就是通过JWT令牌服务解析客户端传递的令牌,并对其进行校验,比如上传三处校验失败,抛出令牌无效的异常。

抛出的异常如何处理?如何定制返回的结果?

这里抛出的异常可以通过Spring Cloud Gateway的全局异常进行捕获,下面只贴出关键代码,如下:

4、鉴权管理器自定义

经过认证管理器JwtAuthenticationManager认证成功后,就需要对令牌进行鉴权,如果该令牌无访问资源的权限,则不允通过。

新建JwtAccessManager,实现ReactiveAuthorizationManager,代码如下:

这里的逻辑很简单,就是取出令牌中的权限和当前请求资源URI的权限对比,如果有交集则通过。

①处的代码什么意思?

这里是直接从Redis中取出资源URI对应的权限集合,因此实际开发中需要维护资源URI和权限的对应关系,这里不细说,为了演示,陈某直接在项目启动的时候向Redis中添加了两个资源的权限,代码如下:

注意:实际开发中需要维护资源URI和权限的对应关系。

②处的代码什么意思?

这处代码就是取出令牌中的权限集合

③处的代码什么意思?

这处代码就是比较两者权限了,有交集,则放行。

5、令牌无效或者过期时定制结果

在第4步,如果令牌失效或者过期,则会直接返回,这里需要定制提示信息。

新建一个RequestAuthenticationEntryPoint,实现ServerAuthenticationEntryPoint,代码如下:

6、无权限时定制结果

在第4步鉴权的过程中,如果无该权限,也是会直接返回,这里也需要定制提示信息。

新建一个RequestAccessDeniedHandler,实现ServerAccessDeniedHandler,代码如下:

7、OAuth2.0相关配置

经过上述6个步骤,相关组件已经准备就绪,现在直接配置到OAuth2.0中。

新建SecurityConfig这个配置类,标注注解 @EnableWebFluxSecurity,注意不是 @EnableWebSecurity,因为Spring Cloud Gateway是基于Flux实现的。详细代码如下:

需要配置的内容如下:

  • 认证过滤器,其中利用了认证管理器对令牌的校验

  • 鉴权管理器、令牌失效异常处理、无权限访问异常处理

  • 白名单配置

  • 跨域过滤器的配置

8、全局过滤器定制

试想一下:网关层面认证鉴权成功后,下游微服务如何获取到当前用户的详细信息?

陈某这里是将令牌携带的用户信息解析出来,封装成JSON数据,然后通过Base64加密,放入到请求头中,转发给下游微服务。

这样一来,下游微服务只需要解密请求头中的JSON数据,即可获取用户的详细信息。

因此需要在网关中定义一个全局过滤器,用来拦截请求,解析令牌,关键代码如下:

上述代码逻辑如下:

  • 检查是否是白名单,白名单直接放行

  • 检验令牌是否存在

  • 解析令牌中的用户信息

  • 封装用户信息到JSON数据中

  • 加密JSON数据

  • 将加密后的JSON数据放入到请求头中

好了,经过上述8个步骤,完整的网关已经搭建成功了。

订单微服务搭建


由于在网关层面已经做了鉴权了(细化到每个URI),因此微服务就不用集成Spring Security单独做权限控制了。

因此这里的微服务也是相对比较简单了,只需要将网关层传递的加密用户信息解密出来,放入到Request中,这样微服务就能随时获取到用户的信息了。

新建一个oauth2-cloud-order-service模块,目录如下:

新建一个过滤器AuthenticationFilter,用于解密网关传递的用户数据,代码如下:

新建两个接口,返回当前登录的用户信息,如下:

注意:以上两个接口所需要的权限已经放入到了Redis中,权限如下:

  • /order/login/info:ROLE_admin和ROLE_user都能访问

  • /order/login/admin:ROLE_admin权限才能访问

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

image

image

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

[外链图片转存中…(img-88mXgLUW-1714525635696)]

[外链图片转存中…(img-3JlbLTDH-1714525635697)]

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud Gateway可以通过整合OAuth2来实现安全认证和授权功能。具体步骤如下: 1. 引入Spring Security和Spring Security OAuth2依赖。 2. 配置Spring Security和OAuth2的相关配置,包括认证服务器地址、客户端ID和密钥等。 3. 在Spring Cloud Gateway中配置路由规则,并添加安全过滤器,将请求转发到认证服务器进行认证和授权。 4. 在路由规则中添加需要进行安全认证和授权的路径和方法。 5. 在授权成功后,将令牌添加到请求头中,以便后续服务可以获取到令牌信息。 通过以上步骤,就可以实现Spring Cloud Gateway的安全认证和授权功能。 ### 回答2: Spring Cloud Gateway是一个轻量级的API网关,而OAuth2是一种基于授权的安全协议,使用Spring Cloud Gateway整合OAuth2可以为API提供更安全的保护。 首先,我们需要在应用程序中引入OAuth2依赖,如下所示: ``` <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>2.3.5.RELEASE</version> </dependency> ``` 接下来,我们需要配置OAuth2具体的认证授权过程。在application.yml文件中进行配置,如下所示: ``` spring: security: oauth2: client: registration: client1: client-id: client1 client-secret: secret1 scope: read,write client-authentication-method: post authorization-grant-type: authorization_code redirect-uri: http://localhost:8081/oauth2/callback client-name: Client 1 provider: provider1 ``` 上述配置中,我们设置了客户端ID、秘钥、范围、客户端认证方式、授权类型等必要参数。其中,“authorization_code”是OAuth2的一种授权类型,通过授权码来获取令牌,这是最常用的一种授权类型。 此外,我们还需要在Gateway中进行相关的配置,包括路由规则、认证过滤器、访问权限控制等。具体实现可以参考springcloudgateway的官方文档。 总的来说,使用Spring Cloud Gateway整合OAuth2可以为API提供更安全的保护,同时也为开发人员提供了更多的灵活性和高效性。 ### 回答3: Spring Cloud GatewaySpring Cloud的一个新项目,它基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术,提供了一种构建API网关的方式。OAuth2是一种基于标准的授权协议,允许客户端(包括第三方应用程序和用户代理)访问受保护的资源。那么,如何在Spring Cloud Gateway集成OAuth2呢? 首先,我们需要在Spring Cloud Gateway中引入spring-cloud-starter-oauth2依赖。然后,在application.yml配置文件中添加以下配置: ``` spring: security: oauth2: client: registration: custom-client: provider: custom-provider clientId: custom-client-id clientSecret: custom-client-secret authorizationGrantType: authorization_code redirectUriTemplate: "{baseUrl}/login/oauth2/code/{registrationId}" scope: - read - write provider: custom-provider: authorizationUri: https://custom-provider.com/oauth2/authorize tokenUri: https://custom-provider.com/oauth2/token userInfoUri: https://custom-provider.com/oauth2/userinfo userNameAttribute: sub ``` 上面的配置中,我们定义了一个名为custom-client的客户端,该客户端使用了我们自定义的OAuth2提供程序custom-provider。在这里,我们还定义了客户端ID和客户端密码,以及授权类型和重定向URI。此外,我们还定义了客户端的作用域和OAuth2提供程序的授权URI、令牌URI和用户信息URI。 在配置完成后,我们需要为Spring Cloud Gateway定义一个OAuth2路由过滤器。可以使用spring-security-oauth2-autoconfigure自动配置这个过滤器。在application.yml中添加以下配置: ``` spring: cloud: gateway: default-filters: - OAuth2GatewayFilterFactory ``` 注意,OAuth2GatewayFilterFactory是spring-security-oauth2-autoconfigure自动配置的名称。 现在,我们可以在Spring Cloud Gateway的路由定义中使用OAuth2路由过滤器了。例如: ``` spring: cloud: gateway: routes: - id: resource-service uri: http://localhost:8080 predicates: - Path=/resource/** filters: - OAuth2=custom-client ``` 在上面的路由定义中,我们使用了自定义OAuth2客户端custom-client。这将强制执行OAuth2认证,以确保只有已验证用户才能访问资源。 最后,我们需要创建一个OAuth2登录页面。使用spring-security-oauth2-autoconfigure依赖可以自动创建登录页面。在application.yml中添加以下配置: ``` spring: security: oauth2: client: registration: custom-client: clientName: Custom Client ``` 上面的配置中,我们定义了客户端的名称为Custom Client。当用户尝试访问受保护的资源时,系统将调用OAuth2登录页面并要求它输入凭据。 这就是在Spring Cloud Gateway集成OAuth2的过程。通过使用Spring Cloud GatewayOAuth2,我们可以轻松地构建和保护API网关,实现更好的安全性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值