REST API权限集成设计
应用分为两大部分,前端html+后端Rest服务,前端html和后端Rest服务部署彻底分离。
目标:可访问资源都处于权限控制之下(意味着经过浏览器地址栏的任意url都会被拦截),并提供跨域访问支持。
***html
项目模块
前端模块:应用界面,经过rest接口与后台交互。
后端模块:UPM(用户权限管理)模块+数据服务(包含多种数据来源,好比本地DB、第三方服务等)统一做为Rest封装层。前端
应用模块权限访问交互流程
Token
- Client和Server交互的令牌,至关于客户端和Server交互的惟一id,绝大部分(登陆时不须要)Client请求都会带上此id,和SessionId相似,只是它没必要受限于单个Web容器并可以自定义Token的过时时间、生成策略。
- 对于一个独立用户,Server和UPM共用相同的Token。
- Token包含tokenid+userid+其它辅助信息.
UPM
UPM提供对整个应用系统中关于资源和用户角色关系的权限配置,而且对外提供认证和受权的接口。后端
Token Manager
维护Token生命周期,可配置Token的过时时间,Token Mananger维护一张hash表,k为用户id,v为Token,每次用户请求匹配token时自动检查Token是否过时,若是过时,则返回过时的状态码。
Token指标:Token使用次数、Token过时时间
Token使用次数:若是客户端请求次数大于了Token默认设定请求次数,则须要从新生成Token,但无需从新登陆。
Token过时时间:超过Token过时时间的请求将会触发从新登陆。api
登陆权限交互流程
业务流:用户登陆(login.html)访问,输入用户名和密码后访问主页(index.html)跨域
登陆权限交互流程:
浏览器
- 用户访问Client静态资源login.html,填写用户名和密码并执行登陆
- 用户名和密码被传递到UPM
- UPM执行认证(authentication),校验用户名和密码
- 认证经过后执行受权(authorization),获取和当前用户关联的全部可访问的资源
- 若是上一步执行成功,UPM将请求TokenManager建立Token,若不经过则返回错误码(受权、认证错误码不一样)
- UPM将token+受权数据返回给客户端
- 客户端收到token+受权数据展示index.html给用户(index.html可能存在多个模块,须要控制页面展现)
备注:Client端须要处理从UPM端返回的数据,包含Token和状态码,若是状态码不是成功标识,依据具体的状态码转向特定页面,不然登陆成功,存储Token(好比存储到Cookie),并跳转到首页。url
登陆后资源访问
业务流:假定用户进入index.html存在一个rest资源连接,对应rest服务"/audience/report",用于请求最新的人群报告,人群报告展现页面为audience.html设计
备注:此时用户已登陆,Client的Cookie中已存在Tokenrest
人群报告权限交互流程:
htm
- 用户点击"人群报告"连接(rest url=/audience/report)
- 客户端发送请求(包含user+rest url+ token)给UPM
- 客户端发送请求(rest url=/audience/report + token)发给Server
- Server匹配token,UPM受权rest url,若是token未过时而且匹配成功而且upm受权成功将调用实际业务处理流获取数据,不然返回错误码
- 将数据和Token信息返回给客户端
- Client依据Server的数据渲染人群报告页面展示给用户
先后端交互备注
- 前端的全部请求,除登入请求以外,其它全部请求都在header中附带用户id(userId)和令牌(tokenId)传递给服务端。
- 任何请求都必须带令牌,若无令牌,直接rest url访问目标资源,则返回登陆页。