Springcloud zuul和shiro结合
一.目标
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结合的更多相关文章
- springcloud Zuul学习笔记
SpringCloud Zull是一个基于NetflixZuul实现的API网关组件,它实现了请求路由,负载均衡,校验过滤等功能;本文主要记录springcloud zuul的入门级demo开发过程; ...
- Angular2,Springboot,Zuul,Shiro跨域CORS请求踩坑实录
前言:前后端分离,业务分离,网关路由等已经成为当下web application开发的流行趋势.前端以单页面路由为核心的框架为主体,可以单独部署在nodejs或nginx上.后端以springboot ...
- springcloud zuul shiro网关鉴权并向服务传递用户信息
1.pom文件 <dependencies> <!--eureka客户端--> <dependency> <groupId>org.springfram ...
- SpringCloud Zuul 路由映射规则配置
阅读目录 前言 快速入门 路由详解 Cookie与头信息 本地跳转 Hystrix和Ribbon支持 过滤器解释 动态加载 后记 回到目录 前言 本文起笔于2018-06-26周二,接了一个这周要完成 ...
- SpringCloud Zuul网关的简单理解
Zuul网关功能 请求路由.服务路由.请求过滤 请求路由 参数配置如下所示,所有能够配置path规则的请求,都会被zuul网关转发到对应的url上. zuul.routes.user-service. ...
- springcloud zuul
zuul是springcloud的API网关. 入口也是springmvc的DispatcherServlet. 实际的handler是ZuulController,通过handleRequest方法 ...
- spring-cloud zuul网关
API Gateway 是随着微服务(Microservice)这个概念一起兴起的一种架构模式,它用于解决微服务过于分散,没有一个统一的出入口进行流量管理的问题. 使用 Zuul 实现 API Gat ...
- 微服务实战系列(六)-网关springcloud zuul
1. 场景描述 今天接着介绍springcloud,今天介绍下springcloud的路由网关-Zuul,外围系统或者用户通过网关访问服务,网关通过注册中心找到对应提供服务的客户端,网关也需要到注册中 ...
- springCloud zuul网关服务
第一步:编写application.properties文件 spring.application.name=api-gateway server.port=5555 zuul.routes.user ...
随机推荐
- shell打印 倒等腰三角形
#!/bin/bash read -p "input the length: " n方法一:内循环中的一个for循环shell写法for i in `seq 1 $n`do ...
- Docker & ASP.NET Core (1):把代码连接到容器
和这种蛋糕一样,Docker的容器和镜像也是使用类似的分层文件系统构建而成的. 这样做的好处就是可以节省硬盘空间,也利于复用等等.因为Docker基于镜像创建容器的时候,其镜像是共享的:而且镜像里面的 ...
- ASP.NET Core WebApi中简单像素转换跟踪实现
像素跟踪虽然是最早用于跟踪营销转换的方法,但它仍然被广泛使用,像Facebook这样的大公司仍然将其视为跟踪网页转换的方法之一. 由于它的简单性,通过像素方法的跟踪转换仍然被广泛使用.它不需要任何复杂 ...
- AssetsUtils【读取assets、res/raw、./data/data/包名/目录下的文件】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了以下功能: 1.读取assets目录下的资源html.文件.图片,将文件复制到SD卡目录中: 2.读取res/raw目录下的文 ...
- springboot~ EventListener事件监听的使用
EventListener事件触发和监听器可以对代码解耦,在一些与业务无关的,通用的操作方法,我们可以把它设计成事件监听器,像通知,消息这些模块都可以这样设计. 事件源 @Getter @Builde ...
- Tesseract 在 windows 下的安装及简单应用
Tesseract 是一个开源的 OCR 引擎,可以识别多种格式的图像文件并将其转换成文本,最初由 HP 公司开发,后来由 Google 维护.下载地址:https://digi.bib.uni-ma ...
- SpringBoot基础系列-SpringCache使用
原创文章,转载请标注出处:<SpringBoot基础系列-SpringCache使用> 一.概述 SpringCache本身是一个缓存体系的抽象实现,并没有具体的缓存能力,要使用Sprin ...
- Spring加载流程源码分析03【refresh】
前面两篇文章分析了super(this)和setConfigLocations(configLocations)的源代码,本文来分析下refresh的源码, Spring加载流程源码分析01[su ...
- AspNetCore中使用Ocelot之 IdentityServer4(1)
AspNetCore中使用Ocelot之 IdentityServer4(1) 前言: OceLot网关是基于AspNetCore 产生的可扩展的高性能的企业级Api网关,目前已经基于2.0 升级版本 ...
- win10安装tensorflow-gpu1.13.1+cuda10.0+cudnn7.3.1
一,本机配置 Win10 64bit NVIDIA GeForce GTX 960M Python3.7(Anaconda) 二,安装CUDA 亲测,TensorFlow-gpu1.13.1支持cud ...