授权,权限的控制
令牌里的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%的几率没权限访问,

重启gateway

这个时候psermissonService实际上是不起作用的。现在网关不认这个permissionService,不知道这个permissionService到底是什么

先申请一个新的令牌,如果令牌过期了的话。


解析表达式失败了。不知道该怎么解析。

现在要告诉它怎么解析这个psermissionService,让他知道permissionService技术这个东西

写一个表达式的处理器

继承的是Oauth2的web安全表达式处理器。在这里处理器里是不知道我自己写的服务的。


把她声明成一个组件

注入我们自己写的permissionService

我们要覆盖它的一个方法


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


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

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

重写安全配置的方法

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

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

重启服务测试

重启网关


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

失败的情况

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

细粒度的权限,到某一个请求,都在网关控制,微服务之间互相调用的时候,只做粗粒度的黑白名单的控制。

结束

Spring cloud微服务安全实战-6-4权限控制改造的更多相关文章

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

    首先来解决认证的问题. 1.效率低,每次认证都要去认证服务器调一次服务. 2.传递用户身份,在请求头里面, 3.服务之间传递请求头比较麻烦. jwt令牌. spring提供了工具,帮你在微服务之间传递 ...

  2. Spring cloud微服务安全实战_汇总

    Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...

  3. 《Spring Cloud微服务 入门 实战与进阶》

    很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...

  4. Spring Cloud微服务安全实战_00_前言

    一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介:  二.最终形成的架 ...

  5. Spring Cloud微服务安全实战_1-1_导学

    这两年微服务是一个很火的话题 .在java语言的体系里,现在最火的就是SpringCloud. 本系列文章主要不是讲:怎么使用SpringSpringCloud组件搭建一个微服务的体系,如服务的认证注 ...

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

    上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...

  7. Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务

    实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...

  8. Spring cloud微服务安全实战 最新完整教程

    课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...

  9. Spring cloud微服务安全实战-6-8sentinel限流实战

    阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...

随机推荐

  1. 第142题:环形链表II

    一. 问题描述 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 ...

  2. NOIP2013积木大赛 [贪心]

    大意 自己查去... 说明 这道题正解是贪心,但标程里是有这样一句话的:把序列分成(a1,..ai)(ai+1,...aj)......(ak,...an)多个非递减序列.然后所有段中最大值的和减去除 ...

  3. Deepgreen & Greenplum DBA小白普及课之三

    Deepgreen & Greenplum DBA小白普及课之三(备份问题解答) 不积跬步无以至千里,要想成为一名合格的数据库管理员,首先应该具备扎实的基础知识及问题处理能力.本文参考Pivo ...

  4. 七.搭建基本的FTP服务

    1.安装vsftpd软件包 ]# yum -y install vsftpd 2.重起vsftpd服务 ]# systemctl restart vsftpd ]# systemctl enable ...

  5. Codeforces 1172D. Nauuo and Portals 构造

    原文链接www.cnblogs.com/zhouzhendong/p/CF1172D.html 前言 明哥神仙打cf方式真潇洒.45分钟切D后就不打了? 我当场爆肝D想错方向不会做自闭了. 题解 考虑 ...

  6. JS 中的prototype、__proto__与constructor

    我们需要牢记两点: ①__proto__和constructor属性是对象所独有的: ② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和construc ...

  7. Prometheus初体验(三)

    一.安装部署 Prometheus基于Golang编写,编译后的软件包,不依赖于任何的第三方依赖.用户只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动Prometheus Server ...

  8. Kafka(三) —— 集群监控

    任何应用功能再强大.性能再优越,如果没有与之匹配的监控,那么一切都是虚无缥缈的.监控不仅可以为应用提供运行时的数据作为依据参考,还可以迅速定位问题,提供预防及告警等功能,很大程度上增强了整体服务的鲁棒 ...

  9. JS中注入eval, Function等系统函数截获动态代码

    正文 现在很多网站都上了各种前端反爬手段,无论手段如何,最重要的是要把包含反爬手段的前端javascript代码加密隐藏起来,然后在运行时实时解密动态执行. 动态执行js代码无非两种方法,即eval和 ...

  10. 360杯复赛流量分析题 详细writeup

    题目名: 这是捕获的黑客攻击数据包 通过分析流量包,得知黑客先上传了一个文件: 追踪TCP流,可以看到文件内容,是一个木马: 然后通过get请求一个加密key,在响应里能看到key的值. 接下来就是用 ...