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 ...
随机推荐
- python的append insert extend pop del remove使用
对于 python 数组的操作,有插入和删除,下面介绍各个函数的功能: 插入 插入的函数有 append.insert .extend append append(i) 是在数组的末尾插入一个元素 i ...
- Linux 进程终止后自动重启
/opt/a.sh #! /bin/bash ps -ef | grep python3 a.py | grep -v grep | grep python3 if [ $? -ne 0 ] then ...
- java~lambda表达式让查询更优雅
在java之前的版本里,如果希望从集合时查找符合条件的数据,如果先遍历他,这种写法是我们不能接受的,所以现在java有了lambda就很好的解决了这个问题,让代码更优雅一些! /** * lambda ...
- HandlerInterceptor拦截实现对PathVariable变量的读取
Http请求拦截作用 拦截后可以修改请求体 拦截后可以作一些其它统一的操作 问题提出 对于很多时间需要拦截很多Http请求,然后去获取一些参数,这些参数可能是querystring串,也可能是路由上的 ...
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理
为什么使用消息队列 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务 ...
- 为 Eureka 服务注册中心实现安全控制
上一篇Eureka 实现微服务注册发现讲了用 Eureka 实现单体版的服务注册与发现.因为本篇是在上一篇的基础上的一点扩充,所以读此篇之前要保证看了上一篇. Eureka 如果不加安全控制,会存在下 ...
- 史上最全office2016 激活码
现在office版本已经更新到2016了,现在给大家分享Office 2016 各个版本的激活码,记得断网激活哈.(本人使用的是家庭版) Office 2016 Pro Retail 版激活密钥: [ ...
- docker daemon 配置文件
Ubuntu Ubuntu 14.04 配置文件位于 /etc/init/docker.conf Ubuntu 15.04 配置文件位于 /etc/default/docker,修改配置项DOCKER ...
- centOS7下Spark安装配置
环境说明: 操作系统: centos7 64位 3台 centos7-1 192.168.190.130 master centos7-2 192.168.190.129 slave1 centos7 ...
- Numpy库的学习(二)
今天来继续学习一下Numpy库的使用 接着昨天的内容继续 在Numpy中,我们如果想要进行一个判断使用“==” 我们来看下面的代码 vector = np.array([5,10,15,20,25]) ...