鉴权,是指验证用户是否拥有访问系统的权利。它是一个系统的重要组成部分,只是我好像从来没有写过相关的文章。于是,于是,最近手不怎么疼,又刚好有几个项目有相关的问题。讨论了多次之后,我发现鉴权简直称得上是一门艺术。
不过,在开始之前,我不得不声明一下这里的场景:
传统的 Cookie-Session 的方式,并不需要这样的方式。
通用的基于 Token 的鉴权方案,大致步骤如下所示:
需要注意的是,对于那些对安全要求高的系统而言,前端所需要提供的参数,不限于用户名和密码,还要有地理位置、设备相关信息等参数。
随后:
好像没的毛病,大家都是这么做的,那么到底哪来的平衡艺术?、
前端是以路由作为边界,来划分不同领域的。也因此,在用户进行每一个路由点击之前, 系统需要对用户是否有权限进行判断。若是用户有权限,便继续访问;若是用户没有权限,那么就返回 401,并重新登录。
基于这种鉴权模式,我们会有多种多样的路由守卫方式。在执行路由跳转时,存在这么一些基础的模式:
于是,我们可以做一个简单的对比(从 1 到 5)。
方式 | 用户体验 | 不可破解性 | 额外的 API 访问 | 后端开发成本 | 前端开发成本 |
---|---|---|---|---|---|
提交时验证 | 3 | 2 | 无 | 3 | 5 |
Token 存在验证 | 3 | 3 | 无 | 3 | 5 |
关键步骤二次验证 | 4 | 4 | 关键路由 | 4 | 4 |
每步验证 | 1 | 5 | 每次路由 | 4 | 3 |
跳转后验证 | 3 | 5 | 每次路由 | 4 | 3 |
相应的解释如下:
对于不同的场景,都可以采用不同的方案。又或者是组合出自己需求的方案。
回到我们的故事上,我们采用的是第二种方案:关键步骤二次验证。
首先,我们有两个后端 API:
前端代码设计(以 Angular 为例):
关键名词解释:
最后,我们的组合模式如下所示:
反正,后端会进行一系列的权限校验,不是吗?
平衡,真的是是一门艺术。
围观我的Github Idea墙, 也许,你会遇到心仪的项目