授权,权限的控制
令牌里的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. MQ的常见应用场景

    MQ的常见的应用场景为:解耦,异步,流量削峰 在解耦场景中: 不使用MQ的耦合场景: 使用解耦的场景为: 异步的方式: 不使用MQ的同步高延时请求场景: 使用异步化之后的接口性能优化: 没有使用mq的 ...

  2. 十七.protobuf在rpc中的使用

    关于protobuf在rpc中的使用,设计到gRPC,相关内容待续....

  3. goto语句——慎用,但是可以用

    最近使用了goto语句,是因为if嵌套太深了,因此把错误处理同意了,直接使用goto语句. 举例: #include <stdio.h> int main () { /* local va ...

  4. Spring Boot 2.x实战之定时任务调度

    在后端开发中,有些场景是需要使用定时任务的,例如:定时同步一批数据.定时清理一些数据,在Spring Boot中提供了@Scheduled注解就提供了定时调度的功能,对于简单的.单机的调度方案是足够了 ...

  5. 什么是C/S和B/S架构?

    C/S架构 C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的. 这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才 ...

  6. Linux Shell 如何获取参数

    $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示 ...

  7. 【CSS3】 新增属性

    一. box-shadow(阴影效果) 使用: box-shadow: 20px 10px 0 #000; -moz-box-shadow: 20px 10px 0 #000; -webkit-box ...

  8. pt

    https://www.hdarea.co/torrents.php http://hdhome.org/torrents.php https://ourbits.club/torrents.php ...

  9. 洛谷 P2032 扫描 题解

    P2032 扫描 题目描述 有一个 1 ∗ n 的矩阵,有 n 个正整数. 现在给你一个可以盖住连续的 k 的数的木板. 一开始木板盖住了矩阵的第 1 ∼ k 个数,每次将木板向右移动一个单位,直到右 ...

  10. Ultra Edit中的数据对齐

    有时会用到Ultra Edit的数据对齐功能.比如,要求64个符号一组,从低位开始对齐.这时,如果数据长度不是一行长度的整数, 就会产生高位对齐.低位不足的问题.为了调整,往往需要逐行调整,很不方便. ...