Spring cloud微服务安全实战-4-7重构代码以适应真实环境

现在有了认证服务器,也配置了资源服务器。也根据OAuth协议,基于令牌认证的授权也跑通了。基本的概念也有了简单的理解。
往下深入之前,有几个点,还需要说一下

使用scopes来控制权限,scopes可以理解为之前的ACL 第三章的时候自己写的ACL来控制的读写权限。在OAuth协议里面用scopes来实现ACL的权限控制,两方面,首先在服务器这一端,可以针对不同的应用发出去不同权限的令牌, 。

比如针对oderApp可以有读权限,也可以有写的权限。

针对orderService发出去的就只有read 读的权限。这是在服务器端,我可以控制发出去的令牌可以包含配置权限,

另外在资源服务器这一端,我也可以根据令牌里的scopes去控制一些权限。那么下面来看下 在服务器端 怎么去做这个事。
还是演示读写权限这样的场景的控制

读写权限演示

orderController 再写一个getInfo。只是为了读和写 这两个请求。

这个适配器里面还有一个方法,可以用来控制我们的访问权限。

默认的配置是任何请求都需要身份认证

有write的scope的时候,才能去调用post请求。

get的请求要有read的scope权限

启动服务测试

首先启动认证服务

现在只去拿reade的权限

现在拿到的token只有read的权限。

启动订单服务。用令牌去创建订单的方法。

错误,争对这个资源没有scope。需要的scope是write。但是你的令牌没有write的权限。

这样我们就基于OAuth2实现了ACL
我们发送一个get请求 可以成功。

在资源服务器中获取用户信息

之前将的是在这里拿到用户名

能不能在之类直接拿到用户信息呢?????创建一个UserDetailsService的实现类。

它里面只有一个方法就是根据用户名返回 UserDetails对象。

创建一个user类。

也要实现UserDetais的接口


把字符串转换成 GrantedAuthority集合返回。

getPassword和getUserName这里就删掉

在上面定义 username和password。然后生成get和set属性。

这两个方法都返回true

密码是不是没过期,也返回true

账户是不是可用的 也返回true

加一个自己特有的属性id并生成get和set方法。这个就是除了UserDetails要求以外,我们自己声明的信息。


把这个UserDetailsService接口的实现,声明成一个Spring的Bean。

有了这个Bean 我们需要修改下配置 ,让它用这个bean来读取相关的用户信息。

我们写一个getAccessTokenConvert这样的一个方法。


设置用userDetailsService转换成user对象。

最终返回

测试

启动认证服务

启动订单服务。


因为当前令牌是存在内存里面的。一旦认证服务器重启了。这些令牌就都消失了 。我们要重新申请令牌。

重新申请令牌


控制台获取到了用户的id

下面的这段逻辑就可以根据用户名去数据库内去查询

只要用户id

这里只要用户的id 也不需要用户的对象了。


这样写了以后,它就会把User对象里面的id单独拿出来 传递出去。可以用这个表达式把对象里面任何一个属性 当做参数传出来。

orderAPi服务 重启


查看控制台的输出

数据持久化

一块是客户端应用的数据,server里面的这段配置。这块信息要放到数据库里。

令牌的信息持久化。生产环境一般是集群,至少是两台机器。
在SpringSceurityOAuth的测试代码里面提供了一组构件表的scheme。这个scheme是争对内存的数据库来写的。主要用来测试的。

把代码复制出来,改一下 争对MySql 主要改了下数据类型。这个目录下的 就是可以直接创建表结构的

建好的表

目前可能就用到这两张表

加上数据库的依赖,一个是jdbc的启动器,它会替我去声明一个数据源,还有jdbcTemplate。
另外一个就是MySql的驱动。

数据库相关的配置也复制到server的微服务里面


首先是把这些放到数据库的表内

写一个main函数,让把加密后的密码打印出来 存到我们的数据库内

这个就是加密后的密码串。

填写多个的用逗号隔开


添加另外一条数据。这样就把客户端的信息都加如到数据库表内了。

读取数据库内的配置

注入数据源。然后用jdbc。把数据源给它。它会自动根据数据源 到数据库内读取auth_client_details表内的数据

把token的信息放进去。

tokenStore是一个接口,作用就是存取token的。把数据源dataSource给它

告诉服务器用这个tokenStore来存取token。

这样token聚会存到数据库内。

测试


访问getToken的请求

这句说明 信息都挪到数据库里面了 但是也可以正常的拿到这些信息。

生成的令牌也存到了access_token的表内

这样就有了一个持久化的令牌。
这个时候不管我是集群也好 ,还是认证服务器重启也好。令牌信息都不会丢失了。

结束

原文地址:https://www.cnblogs.com/wangjunwei/p/11939253.html

时间: 2024-08-28 20:29:29

Spring cloud微服务安全实战-4-7重构代码以适应真实环境的相关文章

Spring Cloud微服务框架 实战企业级优惠券系统

第1章 课程介绍[终于等到你,快来认识我]本章中将对课程中涉及到的技术.工具.业务等进行简单介绍. 第2章 准备工作[工欲善其事,必先利其器]本章中将对课程中使用到的技术工具做介绍,包括Maven.MySQL.Redis.Kafka:会对它们的功能.安装.基本的使用方法进行介绍. 第3章 SpringBoot 开发框架[基础打不牢,学问攀不高]课程主体业务使用SpringCloud框架开发实现,但是SpringCloud基于SpringBoot实现.为便于更顺畅学习,本章中会对SpringBoo

Spring cloud微服务安全实战

第1章 课程导学我们会对整个课程的内容做一个简要的介绍,包括章节的安排,使用的主要技术栈,实战案例的介绍以及前置知识的介绍等内容. 第2章 环境搭建开发工具的介绍及安装,介绍项目代码结构并搭建,基本的依赖和参数设置. 第3章 API安全我们从简单的API场景入手,讲述API安全相关的知识.首先我们会介绍要保证一个API安全都需要考虑哪些问题,然后我们针对这些问题介绍常见的安全机制,我们会针对每种问题和安全机制编写相应的代码,让大家对这些问题和安全机制有一个初步的认识.... 第4章 微服务网关安

Spring cloud微服务安全实战完整教程

本文配套视频教程及资料获取:点击这里 Spring Cloud微服务安全实战 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务场景,解决上述三大问题痛点,并结合实际给出相应解决方案.帮助大家形成对安全问题的系统性思考,实战开发一套可在中小公司落地的完整的安全方案. 学习目标: 技术要点: 环境参数: 本文配套视频教程及资料获取:点击这里 原文地址:https://www.c

Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器

上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后,才会在前边加一个过滤器去验令牌(配置@EnableResourceServer 配置类) 2,要让他知道自己是什么资源服务器(配置资源服务器ID) 3,配置去哪里验令牌,怎么验令牌,要带什么信息去验 (配置@EnableWebSecurity 配置TokenServices,配置Authentica

Spring cloud微服务安全实战-5-7实现基于session的SSO(客户端应用的Session有效期)

授权模式改造成了Authorization code完成了改造的同时也实现了SSO.微服务环境下的前后端分离的单点登陆. 把admin的服务重启.刷新页面 并没有让我去登陆,直接就进入了首页. order的API控制台 只要你在认证服务器上的session没过期.认证服务器就知道你是谁,他就不会让你输入用户名密码了.直接跳回到客户端应用. 一共有三个有效期. 退出操作 退出的时候.现在前端服务器清空session,认证服务器也需要清空session 在前端服务器退出后,再跳转到认证服务器执行退出

Spring cloud微服务安全实战-6-2JWT认证之认证服务改造

首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递令牌.让你不用去写额外的代码 服务器端的改造 看一下认证服务器配置的这个类.这里有个tokenStore,就是令牌的存储器.现在用的是jdbc的TokenStore,令牌是存在数据库里的 我们new  一个jwtTokenStore它 需要一个参数jwtTokenEnhancer 需要set一个ke

Spring Cloud微服务安全实战_4-10_用spring-cloud-zuul-ratelimit做限流

本篇讲网关上的限流 用开源项目spring-cloud-zuul-ratelimit 做网关上的限流 (项目github:https://github.com/marcosbarbero/) 1,在网关项目里,引入限流组件的maven依赖: 2,在网关项目yml配置里,配限流相关配置 github也有相关配置说明:https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit 限流框架限流需要存一些信息,可以存在数据库里,也可以存在red

Spring Cloud微服务安全实战_5-2_基于session的SSO

上一篇将OAuth2授权模式的password模式改造成了授权码模式,并初步实现了一个前后端分离架构下基于session的微服务的SSO.用户在客户端点击登录,会跳转到认证服务器的登录页面进行登录,登录成功后,认证服务器回调到客户端应用的callback方法,并携带了授权码,客户端拿着授权码去认证服务器换取access_token ,客户端拿到access_token后存到自己的session,就认为该用户已登录成功. 上边这个流程是一个基于session的SSO,其中有三个效期: 1,客户端应

Spring cloud微服务安全实战-5-3后端服务改造

本节来实现一个登陆的效果. 需要一个登陆前的页面和登陆后的页面. 直接粘贴过来的代码 这是一个和后台的绑定 后台要有个autenticated的对象来实现绑定,ts内我们定义这个autenticated变量.当autenticated是false的时候,这个hidden就不触发. 方括号绑的是属性,圆括号绑的是方法. ts内我们要定义一个login的方法 双向绑定 后端定义credentials 后端的数据有值了的话.前端的文本框内也会显示上值 为了实现双向绑定还需要引入一些依赖. FormMo