新建一个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,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!
最后
俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!
另外,给大家安排了一波学习面试资料:
[外链图片转存中…(img-88mXgLUW-1714525635696)]
[外链图片转存中…(img-3JlbLTDH-1714525635697)]
以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!