一.目标
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. 我们为什么要搞长沙.NET技术社区(4)

    我们为什么要搞长沙.NET技术社区(4) 邹溪源,2019年3月7日 Ps:文中的.NET 包括且不限定于传统.NET Framework技术和.NET Core技术. 1.    楔子 昨天(201 ...

  2. C++ 之 简单的五子棋AI程序

    本人是大一新生,寒假无聊,抱着试试看的心态(没有想到可以完成),写了C++的简单五子棋程序,开心.     下面是效果图:     一.首先讲讲大致思路.            五子棋实现的基础:  ...

  3. ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

    一.前言  最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...

  4. FragmentTabHostTopDemo【FragmentTabHost固定宽度且居中】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(居中且宽度非全屏)展现. 备注:该Demo主要是演示FragmentTabHost ...

  5. ES 06 - 通过Kibana插件增删改查ES中的索引文档

    目录 1 document的结构 2 document的常见CRUD操作 2.1 添加商品: 添加文档并建立索引 2.2 查询商品: 检索文档 2.3 修改商品: 替换文档 2.4 修改商品: 更新文 ...

  6. 跟王思聪热狗图一样大热的Redis,还不赶紧来Get一下?

    前言 不禁喊出一句ig牛逼!哈哈哈 这个话题是不是有点过时了?但说到Redis,真的是被强行灌输的,到处都会被安利Redis,吓得只会mysql和oracle的我,赶紧去get一波.. 数据库种类 关 ...

  7. 从PRISM开始学WPF(番外)共享上下文 RegionContext-更新至Prism7.1

    RegionContext共享上下文 There are a lot of scenarios where you might want to share contextual information ...

  8. java基础(五):谈谈java中的多线程

    1.多线程 1.1.多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一 ...

  9. 云计算OpenStack:云计算介绍及组件安装(一)--技术流ken

    云计算介绍 当用户能够通过互联网方便的获取到计算.存储等服务时,我们比喻自己使用到了“云计算”,云计算并不能被称为是一种计算技术,而更像是一种服务模式.每个运维人员心里都有一个对云计算的理解,而最普遍 ...

  10. jQuery(三)、属性、CSS

    jQuery设置了很多为标签进行属性的操作,比如添加.删除. 一 .属性 1 attr(name | properties | [key, value | fn]) 设置或返回被选择的属性值. 参数: ...