授权,权限的控制
令牌里的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. JDK源码那些事儿之SynchronousQueue下篇

    之前一篇文章已经讲解了阻塞队列SynchronousQueue的大部分内容,其中默认的非公平策略还未说明,本文就紧接上文继续讲解其中的非公平策略下的内部实现,顺便简单说明其涉及到的线程池部分的使用 前 ...

  2. Ubuntu安装Apache 2.4.7常见问题解答

    环境:Apache 2.4.7 on Ubuntu 14.04 启动apache服务报错:Unknown Authz provider: ip 进入mod模块目录 cd /etc/apache2/mo ...

  3. C语言实验二——位运算

    问题 线性反馈移位寄存器 Linear feedback shift register(LFSR),是指给定前一状态,将该输出的线性函数再用作输入的移位寄存器.异或运算是最常见的单比特线性函数:对寄存 ...

  4. php自定义函数之匿名函数

    所谓匿名,就是没有名字. 匿名函数,也就是没有函数名的函数.直线电机参数 匿名函数的第一种用法,直接把赋数赋值给变量,调用变量即为调用函数. 匿名函数的写法比较灵活. 1.变量函数式的匿名函数 < ...

  5. BZOJ 4332: JSOI2012 分零食 FFT+分治

    好题好题~ #include <bits/stdc++.h> #define N 50020 #define ll long long #define setIO(s) freopen(s ...

  6. PHP利用执行操作符;模拟shell命令

    $out = `ls -la`; echo '<pre>'.$out.'</pre>'; 输出结果: total 10 drwxrwxrwx 1 root root 4096 ...

  7. 洛谷 P1842 奶牛玩杂技 题解

    P1842 奶牛玩杂技 题目背景 Farmer John 养了N(1<=N<=50,000)头牛,她们已经按1~N依次编上了号.FJ所不知道的是,他的所有牛都梦想着从农场逃走,去参加马戏团 ...

  8. deepin 深度Linux系统 15.11 链接蓝牙鼠标问题

    不知道为毛就是搜索不到,好吧只能用老方法,那就是不使用deepin系统自带的面板进行管理 用下面的命令进行安装配置即可 sudo apt install bluetooth blueman bluem ...

  9. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  10. Django基础(1)-虚拟环境的安装及配置

    virtualenv介绍 (1)做什么的?virtualenv是用于创建独立的python环境,使得多个python应用彼此独立: (2)优点: a)使不同应用开发环境独立 b)环境升级不影响其他应用 ...