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 ...
随机推荐
- JavaSSM框架报HTTP Status 500 - Servlet.init() for servlet springMvc threw exception错误
如下,刚搭建的项目报这样的错,刚学框架的我一脸懵逼...网上很多说是jdk或者springmvc的的jar的版本问题,但是我其他项目都可以啊,所以排除了这个问题. 经过几个小时的排查,发现了我的问题所 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存
代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...
- pandas操作
python中使用了pandas的一些操作,特此记录下来: 生成DataFrame import pandas as pd data = pd.DataFrame({ 'v_id': ["v ...
- js判断参数是否为非数字
isNaN() 函数用于检查其参数是否是非数字值.
- Ocelot.JwtAuthorize:一个基于网关的Jwt验证包
Ocelot作为基于.net core的API方关,有一个功能是统一验证,它的作用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证:之前我有一篇博文https:// ...
- jenkins maven 自动远程发布到服务器,钉钉提醒团队
jenkins 自动远程发布到服务器 1.安装jenkins 安装过程:自行百度 英文不好的,不要装最新版的jenkins.建议安装Jenkins ver. 2.138.4,此版本可以设置中文语言,设 ...
- Docker进阶之二:Docker内部组件
Docker内部组件 一.Namespaces 命名空间,Linux内核提供的一种对进程资源隔离的机制,例如进程,网络,挂载点等资源. docker run -d busybox ping ba ...
- Mondrian + JPivot 环境配置
一.环境准备 特别说明:Mondrian + JPivot 环境笔者已整理调试通过,可直接部署运行. 1.1 环境要求 JDK1.8+ 1.2 环境包说明 从 https://pan.baidu.co ...
- Mysql、SqlServer、Oracle三大数据库的区别
一.MySQL 优点: 体积小.速度快.总体拥有成本低,开源: 支持多种操作系统: 是开源数据库,提供的接口支持多种语言连接操作 : MySQL的核心程序采用完全的多线程编程.线程是轻量级的进程,它可 ...
- Redis Cluster搭建高可用Redis服务器集群
一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节 ...