Spring cloud微服务安全实战-6-4权限控制改造
授权,权限的控制
令牌里的scope包含fly就有权限访问。根据Oauth的scope来做权限控制,

要让@PreAuthorize生效,就要在启动类里面写一个注解。

里面有一个属性叫做,就是在方法的执行之后可以用注解来插入一些方法安全的相关的一些表达式。


这样orderController里面的注解就会生效了

启动测试
认证服务器。

网关

orderAPI

申请一个新的令牌

复制生成的这个令牌。

去调用创建订单的方法

收到一额403 就是不允许访问。

说明我们这个注解是生效的,因为我们发出的令牌只有read和write

这里把scope改成write

重启OrderAPI
还是这个令牌,同样的请求在发送一次


scope这个东西是争对客户端应用的。
数据库内的read、writes是争对admin这个应用来说的。我发给admin这应用的时候有read和write这两个scope,但是它无法聚焦到某个人身上。

根据角色hasRole这个表达式

那么这个Role从哪里来呢?我们在分发令牌的时候,写了一个userDetails的实现类。这里组装UserDetails接口的实现,这个接口

这个接口里面有个方法 getAuthorizaties

这里指定了authories为ROLE_ADMIN 这个就是我们给用户指定的角色。这个方法里面实际是可以根据不同的用户名指定不同的角色的

这里的authorities是可以根据不同的人区分开的。

比如说这里配置为只有 ROLE_USER这个角色才可以访问

重启order服务
这个时候就会判断当前传来的用户,authorities里有没有ROLE_USER

访问被拒绝,

改成ROLE_ADMIN

再次重启order服务

可以访问

这是最简单的 在方法上是判断。没法应用复杂的场景。
角色总是在变,角色也在变。每次改了方法上配置,走要重启服务。
角色和权限实时变化怎么去做授权?
在网关上做复杂的权限控制。
我们之前在网关上有这么个配置,出了token的请求,都需要做身份认证。

这里修改成access ,你给它指定一个访问的规则。
request就是当前的请求,authentication就是当前的用户。
调用一个服务的hasPerission方法,把当前请求和当前用户传进去。这个方法返回一个bool,true或false。如果是true你就能访问,false 就不能访问。


permissionService从哪里来?这个就要自己去写了。
声明一个接口叫做PermissionService。

里面只有一个方法就是hasPermission。authentication里面就包含了用户的信息。

实现类。


声明称一个spring的service

在这里调用你的远程服务,或者查询数据库,或者查redis,或者网关启动的时候,已经把权限信息缓存到内存里了。

这里应该是真正调用业务逻辑的服务来判断,这里我们就不调用服务了,打印一些信息。
50%的几率有权限访问,50%的几率没权限访问,

这个时候psermissonService实际上是不起作用的。现在网关不认这个permissionService,不知道这个permissionService到底是什么
先申请一个新的令牌,如果令牌过期了的话。



解析表达式失败了。不知道该怎么解析。
现在要告诉它怎么解析这个psermissionService,让他知道permissionService技术这个东西

写一个表达式的处理器

把她声明成一个组件

注入我们自己写的permissionService

我们要覆盖它的一个方法


创建一个评估的上下文来告诉它 permissionService怎么解析。
首先执行以下super的方法,创建一个标准的评估上下文。


在这个标准的评估上下文上,我们去设置一个变量。

有了这个表达式处理器,在表达式里面写psermissionService这个字符串的时候,她就知道我应该是去调用这个注入进来的psermissionService这个类里面的方法了。
重写安全配置的方法

注入我们自己写的表达式处理器。,

配置上表达式处理器,这个时候系统再去解析这个表达式的时候就会用我们自己写的表达式处理器了

重启服务测试

50%的成功率 需要多点击几次。

失败的情况

最终的效果,认证服务器里是有权限的服务的。权限服务和订单服务一样也是微服务。前端应该也有权限服务的页面。用户可以通过调页面管权限服务。把你的权限逻辑配到服务器里面。

细粒度的权限,到某一个请求,都在网关控制,微服务之间互相调用的时候,只做粗粒度的黑白名单的控制。
结束
Spring cloud微服务安全实战-6-4权限控制改造的更多相关文章
- Spring cloud微服务安全实战-6-2JWT认证之认证服务改造
首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring Cloud微服务安全实战_1-1_导学
这两年微服务是一个很火的话题 .在java语言的体系里,现在最火的就是SpringCloud. 本系列文章主要不是讲:怎么使用SpringSpringCloud组件搭建一个微服务的体系,如服务的认证注 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
随机推荐
- 复杂Java对象所占内存的大小
我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...
- 完美字符子串 单调队列预处理+DP线段树优化
题意:有一个长度为n的字符串,每一位只会是p或j.你需要取出一个子串S(注意不是子序列),使得该子串不管是从左往右还是从右往左取,都保证每时每刻已取出的p的个数不小于j的个数.如果你的子串是最长的,那 ...
- Centos7 minimal 安装npm
最小版本缺少很多源,需要手动去添加源 如何去判断yum中 有没有 npm 的源呢 yum list | grep npm 如果是这样的,就代表需要自己去添加 curl -sL -o /etc/yum. ...
- elasticsearch7.x集群安装(含head、bigdesk、kibana插件)
网址:https://www.elastic.co 192.168.14.239 es-node1192.168.14.240 es-node2192.168.14.241 es-node3 ==== ...
- winform DateTimePicker 设置成秒
C# Windows窗体应用中,用到时间选择控件DateTimePicker,发现不能选择时分秒,难道要自己写一个控件?! 答案是否定的,通过属性修改是可以选择时间的,DateTimePicker完全 ...
- html 摄像头画面水平翻转
<video onloadedmetadata="" id="inputVideo" autoplay muted playsinline>< ...
- Windows下串口编程
造冰箱的大熊猫@cnblogs 2019/1/27 将Windows下串口编程相关信息进行下简单小结,以备后用. 1.打开串口 打开串口使用CreateFile()函数.以打开COM6为例: HAN ...
- (25)打鸡儿教你Vue.js
vue-cli // 全局安装 vue-cli npm install --global vue-cli // 创建一个基于 webpack 模板的新项目 vue init webpack my-pr ...
- subcode
在思考.查阅subcode时,我发现Magma,Sage Math软件都提供了具体的命令和例子,对subcode的认识比较具象. 例如:Sage Math中有如下命令: C1 = codes.Hamm ...
- C#求任意两整数之和
2019.9.11 作业要求: 求出任意两整数之和 解决方案: using System; using System.Collections.Generic; using System.Linq; u ...