笔记:自研用户登录鉴权机制流程与实现过程

背景:

现在所在公司有一套自研的工程设计IDE,可以根据项目需求自主配置相关参数并应用于各个项目
该项目已经正式上线,且配置都已正常使用
但由于之前开发时并没有设计用户管理相关的机制,也就是说只要知道了项目地址任何人都可以进入项目修改配置,这明显具有很大的风险,需要设计开发一个用户管理的流程与机制

流程构想:

传统的登录鉴权与token管理主要依赖应用已有的 JWT 相关机制
但因为我比较喜欢发明创造,我想自己设计一套自有的用户鉴权机制,现初步工作如下:

  1. 用户表设计(数据库应用MongoDB,后台为Node.js Koa框架)
  2. 密码保护措施,前后台明文加密
  3. token的验证与管理
  4. 管理员与普通用户的权限分离(依赖于(1)用户表设计)

1、用户表设计

const userSchema = {
	    "_id" : 'String',
	    "password" : 'String(加密)',
	    "token" : 'String',
	    "lastAwakeTime" : 'Number(时间戳,用户最后活跃时间)',
	    "phoneNumber" : 'String',
	    "employeeNo" : 'String',
	    "username" : 'String',
	    "position" : 'String?',
	    "email" : 'String?',
	    "isAdmin" : 'Boolean',
	    "createdAt" : 'Number(时间戳)',
	    "lastUpdatedAt" : 'Number(时间戳)',
	}

2、密码保护措施,前后台明文加密

在公司很多应用中,前台用户提交的用户名与密码并未使用加密流程,比如以下情况:

java API鉴权算法实现 java登录鉴权_后端


以上情况我认为是一个应用不严谨的表现,这种情况在 2B 应用中倒还好,但一旦应用于比较敏感的 2C 应用中时,这就成为了一个明显的漏洞。根据这种情况,所以我决定首先在前台实现密码传输加密,对用户输入的结果进行一个保护,传入后台后再进行一个二次加密,最后对比验证,具体流程如下:

java API鉴权算法实现 java登录鉴权_后端_02

java API鉴权算法实现 java登录鉴权_前端_03


这保证了前台是密文传输的同时在后台进行二次加密保证了密码的安全性,添加用户流程思想基本相差无几,在此不过多赘述3、token的验证与管理

token主要作用于用户登录过期时的检查与校验

在本流程中 tokenlastAwakeTime 互相配合,实现了用户的登录过期与防止双端登录的机制

具体流程如下:

java API鉴权算法实现 java登录鉴权_用户登录_04


以上流程可以根据token的验证机制排除双端登录的情况,同时也实现了用户登录的过期机制

4、管理员与普通用户的权限分离(依赖于1用户表设计)
根据(1)中数据表设计,我们可以在用户登录时传入isAdmin字段,在前端进行一个权限的判断
将isAdmin存入缓存,配置需要权限的功能,实现普通用户与管理员用户的区分

总体流程:

java API鉴权算法实现 java登录鉴权_用户登录_05

总结:

关于用户登录鉴权相关流程的解决方案其实非常多,我也许只是做了比较简单的一个设计,真正的复杂流程或许还需要在以后的开发研究过程中逐步探索。由于本人去年刚毕业,到如今真正入行不到一年且需要同时顾及前后台的开发,所以以上流程肯定有诸多不足,同时也望路过的各位大佬不吝赐教。

(全文完)