欢迎关注全是干货的技术公众号:JavaEdgehtml
本文主要内容:java
- 如何实现用户认证与受权?
- 实现的三种方案,所有是经过画图的方式讲解.以及三种方案的对比
- 最后根据方案改造Gateway和扩展Feign
也可以使用粘性会话,即:对相同IP的请求,NGINX总 会转发到相同的Tomcat实例,这样就就无需图中的Session Store了。不过这种方式有不少缺点:好比用户断网重连,刷新页面,因为IP变了,NGINX会转发到其余Tomcat实例,而其余实例没有Session,因而就认为用户未登陆。这让用户莫名其妙。git
粘性会话不是本章重点,若是感兴趣能够百度一下(用得愈来愈少了)github
这里讲的是解密Token直接拿到用户信息;事实上要看项目的具体实现;有时候Token里不必定带有用户信息;而是利用Token某个地方查询,才能得到用户信息。web
◆ OAuth2实现单点登陆SSO算法
◆ OAuth 2.0系列文章spring
安全性好
可是实现成本高,并且屡次token交换和认证,因此有性能开销编程
登陆成功后,网关颁发token,以后用户的每一个请求都会携带该token,网关对其解密是否合法,过时等,token中会携带用户信息,因此网关还可解析token便可知道用户是谁,好比解析出了id和name,就会将其加入请求的header中进行转发,每一个服务就知道是啥子用户啦!小程序
优势是实现简单,性能佳,可是一旦网关的登陆认证被攻破,就凉了安全
请求通过网关到认证受权中心去登陆,成功则颁发token,以后用户请求都会携带该token,可是网关不对token作操做
这样下降了网关的设计复杂度,网关再也不关注用户是谁了(再也不解密解析token),只负责转发
让系统也避免了裸奔的尴尬
可是要想解密token,仍是须要密钥,如今每一个微服务都要去作解密工做,意味着每一个服务都知道密钥了.被泄露的风险随之增大,须要防止这种状况,能够按期更新密钥,想办法不让开发直接看到密钥自己(可是通常吧,除非有内部脑残人士才会泄露密钥,通常仍是很安全的)
实现并不复杂,下降了网关的复杂度,可是密钥若是泄露了,就完了,这个能够借助后面的方法避免,先留坑
咱们使用的token其实就是JWT,what's that?
JWT全称Json web token ,是一个开放标准(RFC 7519) ,用来在各方之间安全地传输信息。JWT可被验证和信任,由于它是数字签名的。
◆ Signature = Header指定的签名算法
(Base64(header).Base64(payload), 秘钥)
● 秘钥: HS256("aaaa.bbbbb",秘钥)
推荐阅读
JWT操做工具类分享
一样的方式为内容中心添加JWT配置,再也不赘述,注意secret都保持一致
在用户中心添加依赖
服务实现
Spring AOP
咱们固然使用优雅地AOP切面编程这种可插拔的方式
定义注解
具体代码看github
与用户中心相似,再也不赘述
使用feign时并无传递token,因此当作未认证处理
修改控制器,以后将编译报错的代码都注释掉
须要修改控制器,这很差,弃用
exchange()
ClientHttpRequestInterceptor
需求:用户role须是管理员才有权访问
经过注入的属性值判断,对于API多的就不合时宜了!
固然你用过滤器,拦截器实现也是能够的.
修改网关配置
◆ 登陆认证的四种方案
◆ AOP实现认证受权
◆ N种访问控制模型
◆ Feign传递Token
◆ JWT
◆ RestTemplate传递Token