背景:
门户网站分为我的用户,我的开发者,机构用户,页面不一样的操做须要特定的用户才能操做。如api申请,密钥下载只有机构用户才可操做,重置密码须要登陆后才可操做。
管理端分为系统管理员,开放平台管理员,银行管理员,不一样的角色具备不一样的权限,
权限按资源划分
服务间调用也须要进行保护,如调用发送短信接口,调用发送站内信的接口,不能不加限制地对外暴露。
所以须要以接口为粒度进行统一鉴权,在接口处注明须要的权限,需注明请求来源:门户,管理端,服务间调用。若是是门户或管理端,还可标注须要的角色或资源。可校验多个来源。前端
技术设计:
对于门户网站和管理端,用户登陆成功后生成包含用户信息(userId)的JWT token,前端保存在vuex中。每次操做请求将token放入front- Authorization和manage- Authorization以供服务端校验。其中front和manage表明源自门户和管理端。
服务间调用发送http请求时,在header处添加service- Authorization,值为有效期为30s的JWT token,service表明源自服务间调用。
经过注解标记须要校验的接口,并添加所须要的请求来源和资源名称,若是匹配则放行,不然报无权限请求。
利用拦截器对请求进行切面操做,若是该方法加@AuthRequest注解则寻找header,若包含front- Authorization,manage- Authorization或service- Authorization,则对该token进行JWT校验。其中front和service校验较为简单,直接校验即刻,manage校验token成功后还需从token中获取userId,经过服务间调用判断该用户是否拥有该资源。若是门户和管理端校验成功,从token中取出userId,role放入attribute,供接口使用。
引入该包还为feign调用添加service- Authorization的headervue
流程图:web
说明:
门户网站,管理端和服务间调用一般经过gateway,可是统一校验不在gateway,而在各自服务,缘由以下:redis
权限是一种安全策略,用户只可访问被受权的资源。所以须要采起策略控制用户的行为。
涉及到如下几个方面:vuex
权限功能在服务从单体转向微服务架构面临以下挑战:后端
微服务应用的权限功能应具备特色:api
现有的解决方案:安全
通过比较,决定自行研发一套权限校验框架,包括:cookie
架构图:session
Token设计
一段字符串,用户登录成功后服务端生成返回至客户端保存,做为后续已登录状态的凭证。
优势:
应具备如下特色:
过时策略:
Token过时后应进行续签,而不是跳转到登录画面,形成糟糕的用户体验。Token失效时间过长会存在安全性隐患,太短会形成频繁的refresh token。好的体验应该是在用户无感知的状况下进行token刷新。
什么时候refresh token: