一、业务时序图
Emos在线办公系统有两种登陆的方式,一种是微信小程序扫描二维码登陆,这个功能已经实现了,内置到项目中;另一种是账户密码的登陆方式,我们写程序实现的就是该功能。
我们动手写用户登陆的代码之前,必须要先了解其中的具体流程,所以我画了下面这幅时序图,咱们对照时序图写程序,思路更加清晰。
上面时序图中,后端项目最终返回给前端的R对象中包含两种数据,一个是布尔值代表登陆结果,另一个是该用户的拥有的权限列表。因为在前端需要根据权限判断用户是否可以看到某些栏目和执行某些操作。
二、用户密码的加密与解密
在tb_user
数据表中保存的用户信息里面,password
字段的值是经过加密存储的,而且不存在全局密钥。我使用每个用户的username
作为密钥,对password
字段加密。也就是说100万条用户记录,就存在100万个密钥。这对黑客采用穷举方法破解密钥来说,计算量超级大。如果每个密钥中采用加盐的做法,那么黑客估计自杀的心都有了。大家可以自己设计加盐的做法,例如对用户名取MD5值,然后取最后六位字符和用户名拼接在一起,当做密钥。
说回到加密算法,我这里采用的是IBM开发的AES算法。这种对称加密算法在加密和解密数据的时候,使用相同的密钥。也就是说密钥既可以用来加密数据,也可以解密数据。关于AES算法的优点我这里不展开说明了,大家可以自己百度查阅资料。 MySQL数据库提供了内置的DES加密和解密的函数,我们只需要调用即可。加密的函数叫做`AES_ENCRPT()`,解密的函数叫做`AES_DECRPT()`,下面咱们结合具体案例了解这两个函数的用法。
SELECT AES_ENCRYPT("abc123456","HelloWorld");
因为加密后的字节数据在UTF8字符集中会出现乱码,所以我把字节数据转换成16进制数据(HEX),就不会出现乱码了。 ```sql SELECT HEX(AES_ENCRYPT("abc123456","HelloWorld")); ```
解密的时候,我们需要先把16进制数据转换成字节,然后进行解密。
SELECT AES_DECRYPT(UNHEX("F943968B28B2D93E2DC48CD72014FE1A"),"HelloWorld")
三、注册超级管理员账号
在emos项目中,并没有内置默认的超级管理员账号,需要我们先在手机上面注册超级管理员账号。首先大家把各种数据库、RabbitMQ运行起来,然后运行emos-wx-api
和emos-wx
两个项目。
特别是运行小程序的时候,我们必须要在微信开发者工具上面选择真机调试,绝不可以在模拟器上面运行。因为小程序的API接口有变动,现在想要获得用户的微信昵称、头像信息等内容,只能用真机运行。
在登陆页面选择注册用户,然后填写专门用来注册超级管理员的激活码:000000
用户注册成功之后,我们去查看tb_user
数据表,可以看到admin账号已经添加成功了,默认密码是abc123456,后续用户可以自行修改。至于超级管理员的姓名、部门、邮箱、入职日期,这些内容大家可以填写上初始值。