一.目标
1.外部请求统一从网关zuul进入,并且服务内部互相调用接口要校验权限

2.cloud和shiro结合,达到单点登录,和集中一个服务完成权限管理,其他业务服务不需要关注权限如何实现

3.其他服务依然可以控制权限细粒度到接口,如在接口上使用@RequirePermisson等注解,方便开发

二.思路
SpirngCloud zuul网关有两个作用,一个是分配路由,一个是过滤。

zuul的过滤器作用有限,只能简单的做一些某个url是否能够访问之类的,无法像shiro一样细粒度到某个用户是否有某种权限;

shiro单体应用大家都会做,那变成微服务后,难道每个服务都要写一套shiro框架?这显然也太麻烦。

1.在zuul服务里用shiro,做成动态url权限控制,就是把访问哪个url需要用什么权限,写入数据库,在过滤器读取与用户有的权限作对比;但是服务互相调用校验就行不通了,因为服务间调用不走zuul

2.写一个服务专用于shiro认证和授权,包含用户、权限的curd,暴露出查询一个用户拥有什么权限的接口;在其他服务中,都写一个拦截器拿访问者token去授权服务拿此用户的权限,再跟请求的url对比;或者可以自定义注解用aop,注解标注的是访问此url需要什么权限,远程调用授权服务接口查询当前用户所有权限,与请求的url对比。

但是这个要自己实现拦截器。

3.第二种思路的简单版本。

写一个server服务专用于shiro认证和授权,包含用户、权限的curd,暴露出查询一个用户拥有什么权限的接口;

在写一个client项目打成jar包供其他服务使用,也是用shiro框架,不同于server服务的是,在realm中只有授权方法,没有认证方法,并且授权方法的实现是去server远程查询权限,再返回给client项目的安全管理器。且client的登录接口写成server的登录接口,这样未登录的用户都会跳转到server登录,想办法保存下原路径,登录成功后再返回原服务;同时做成session共享

普通业务服务只需要依赖于client,就相当于每个服务都有了一套shiro。

这种思路来自于《跟我学shiro》的多项目集中权限,其实想想这种思路是可以的,shiro本质也是靠拦截器进行权限校验,虽然相当于每个服务都开启了一套shiro,但也就是容器中多了一些shiro拦截器和实例,而且可以用shiro的各种功能,开发方便。可以完成我们的三个目标。

三.其他思路
1.分布式session

用户在网关进行登录认证;如果通过,将用户信息存在第三方组件,mysql、redis;后端其他服务可以通过第三方组件拿到用户数据。
这种方案值得推荐,方便扩展,但依赖于第三方组件,注意第三方组件的高可用。
2.客户端token与网关结合

服务器无session,将用户信息存储在token,比如JWT。

了解JWThttps://www.cnblogs.com/cjsblog/p/9277677.html

客户端携带用jwt加密的token,访问网关,token携带了用户的信息
网关对token认证和校验
校验通过网关后,请求携带token到具体服务,可以校验具体的url权限
如果用户信息量大,则不适合,因为都是存储在客户端的;并且token要在网关注注销
zuul + OATHU2+JWT
3.浏览器cookie和网关结合。

和上述方案相同,区别是用户信息完全放在cookie,不用token
---------------------------------------------------------

外加一段优秀的对话:

A:大佬有没有想过用单点登录sso ,把登录写成一个服务shiro在这个服务里面作用,需要访问别的服务的时候zuul反向代理到sso的服务进行认证登录,可这样我现在遇到这样的问题,shiro的授权怎么才能被其他的服务知道,并且在页面进行细粒度级别标签控制拦截

B 回复 A: 嗯。不经过。zuul是给外部调用使用的。。

C回复 A: 看文章,服务之间互相访问是不经过zuul的,只有外部请求访问才通过zull

B回复 A: 其实有简单的方法可以实现类似的目标。就是把个人信息放在Redis或者其他nosql库里,同时放入的还有个人的权限信息,包括可访问的资源信息和角色。然后可以用zuul来进行过滤判断。这样写,就很简单了。不需要用到shiro,也可以避免很多问题。

B 我现在的想法是吧feignServer单独写成服务,然后将接暴露,其他服务调用这个接口,来进行判断权限。但是这样,会不会有网络延迟发生?

B回复 E: 我是返回统一的result的,里面封装了flag标识。。把shiro单独写成服务,有一个好处就是让其他服务不用再集成shiro,只要去访问shiro这个服务就能知道是否有权限了。其他服务如果要判断的话,就去调用接口就好了。

B回复 A: 可行。已经实现了。feignClient服务暴露出2个接口,权限和角色的认证接口就可以了。注意feign的无状态认证。

A回复 B: 大佬,这样可行,可是别的服务需要授权的时候怎么办

C回复 B: 我认为本质上就是这个思路,cloud里面每个页面上的请求都要经过网关转发一次,那也要有网络延迟了,没办法。适当加上缓存吧,不用每次都去请求server判断权限

-----------------------希望可以帮助到你么

Springcloud zuul和shiro结合的更多相关文章

  1. springcloud Zuul学习笔记

    SpringCloud Zull是一个基于NetflixZuul实现的API网关组件,它实现了请求路由,负载均衡,校验过滤等功能;本文主要记录springcloud zuul的入门级demo开发过程; ...

  2. Angular2,Springboot,Zuul,Shiro跨域CORS请求踩坑实录

    前言:前后端分离,业务分离,网关路由等已经成为当下web application开发的流行趋势.前端以单页面路由为核心的框架为主体,可以单独部署在nodejs或nginx上.后端以springboot ...

  3. springcloud zuul shiro网关鉴权并向服务传递用户信息

    1.pom文件 <dependencies> <!--eureka客户端--> <dependency> <groupId>org.springfram ...

  4. SpringCloud Zuul 路由映射规则配置

    阅读目录 前言 快速入门 路由详解 Cookie与头信息 本地跳转 Hystrix和Ribbon支持 过滤器解释 动态加载 后记 回到目录 前言 本文起笔于2018-06-26周二,接了一个这周要完成 ...

  5. SpringCloud Zuul网关的简单理解

    Zuul网关功能 请求路由.服务路由.请求过滤 请求路由 参数配置如下所示,所有能够配置path规则的请求,都会被zuul网关转发到对应的url上. zuul.routes.user-service. ...

  6. springcloud zuul

    zuul是springcloud的API网关. 入口也是springmvc的DispatcherServlet. 实际的handler是ZuulController,通过handleRequest方法 ...

  7. spring-cloud zuul网关

    API Gateway 是随着微服务(Microservice)这个概念一起兴起的一种架构模式,它用于解决微服务过于分散,没有一个统一的出入口进行流量管理的问题. 使用 Zuul 实现 API Gat ...

  8. 微服务实战系列(六)-网关springcloud zuul

    1. 场景描述 今天接着介绍springcloud,今天介绍下springcloud的路由网关-Zuul,外围系统或者用户通过网关访问服务,网关通过注册中心找到对应提供服务的客户端,网关也需要到注册中 ...

  9. springCloud zuul网关服务

    第一步:编写application.properties文件 spring.application.name=api-gateway server.port=5555 zuul.routes.user ...

随机推荐

  1. Docker & ASP.NET Core (4):容器间的连接

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ...

  2. 【社群话题分享】你的网站 HTTPS 了吗?

    每周三下午的话题活动是又拍云技术社群的优良传统-大家一起来看看这周都聊了些啥吧! 推荐阅读: 当 “HTTP” 先生遇上“S”小姐 了解 HTTPS,读这篇文章就够了 HTTPS 是什么? HTTPS ...

  3. ViewPagerWithImageDemo【ViewPager如何判断滑动到第一页和最后一页以及弹出对话框功能】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录viewpager滑动的时候弹出对话框的功能(关键功能是滑动弹出对话框后,隐藏对话框的时候当前页可以还原到原位置),顺便判断首页 ...

  4. [翻译 EF Core in Action] 1.5 关于NoSql

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  5. #6 判断一个数是否为2的n次方

    「ALBB面试题」 [题目] 如何判断一个数是否为2的n次方 [题目分析] 看到这种题,相信大家第一反应就是循环除2,这样做肯定是可以得出结果的:但是这种做法无疑大大增加了计算机的运行时间,一个非常大 ...

  6. [Nodejs] node的fs模块

    fs 模块 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作 API. Node 导入文件系统模块(fs).Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如 ...

  7. Notepad++替换SQL Server Select窗口列名的中括号的小技巧

    条件:“查找模式”那选中“扩展” 一.简单替换 查找目标(包括空格,各个SSMS版本可能不同): ]\r\n ,[ 替换为:, 二.替换为@ 查找目标(包括空格,各个SSMS版本可能不同): ]\r\ ...

  8. Innosetup 设置文件的相对路径

    在使用innosetup自动化打包的过程中,如果打包配置文件要随代码一起提交,则需要将打包文件改为相对路径,以便在其它端也可以直接打包,而不需要再次修改文件路径参数. 添加自动化打包文件 1. 添加b ...

  9. ITSA(IT Strategy and Architecture)方法介绍

    Architecture Capability – At a Glance Architectural coherence part1 Architectural coherence part2 SA ...

  10. 使用jQuery增加或删除元素(内容)

    使用jQuery增加或删除元素(内容):一.jQuery添加元素或内容:1,append() 方法:在被选元素的结尾插入元素或内容 2,prepend() 方法:被选元素的开头插入元素或内容. 3,a ...