用户都是一个公司的核心。本次我们讨论用户的问题。
创建简单的用户表。编号id,姓名,账号密码,创建初始时间,登录时间,用户状态。这些都是很基本的一些状态记录。
互联网都是虚拟网络,现在网络账号跟你本身身份并没有很强的绑定,所以一般是手机号实名认证,那么用手机号来代替你的账号居多。
1.基本的手机号不能重复注册,以及基本的手机号前端认证是用对应的正则匹配去实现
2.怎么去校验手机号的归属人是注册人,那么就要利用短信验证,这里使用的是阿里大鱼的短信验证,看需要包套餐可以便宜一些,例外注意申请需要一定时间,需要提前一些去申请,才不会拖到后面,匆匆忙忙被打回重新申请,对接也简单就是对应sdk引入,然后你在阿里的一些信息固定,进行调用
3.手机账号输入时候,只要号码符合正则就运行进行去阿里大鱼短信校验,那么问题来了,用户如果胡乱输入,只要通过短信前端正则校验就可以传递到后台进行阿里大鱼校验,只要经过这一步到后端,就会让你调用阿里接口,就开始计费。
这里你需要考虑的是这几方面的问题,1.手机号码是否符合,首先是前端正则过滤一层,这个基本过滤乱试的一些,比如是111111,这种没技术含量的
2.别人稍微带恶意攻击的,通过F12,找到你注册账号,或者向用户手机发送短信校验的接口,用python跟java也可以实现,java可能利用httpclient,没有python那么方便。应对,1.加上图片校验,需要滑动,然后图片达成完整。这种杜绝很大部分无脑的。(后续是,这种对js有要求的,360兼容模式跟ie不是很支持,所以之后降级为就一划到底的那种,别问,问就是不是做不到,而是要考虑用户的电脑浏览器是不一样的,你要做到符合大部分。当然你也可以判断用户浏览器,然后分开判断是选用拼凑成完整图片还是一划到底,不过二者对比效果差不多)。3.进行ip的记录,也就是对于同一个ip如果频繁调用,就进行ip禁止掉(实现方法,初级实现数据库记载,你可以记录xxip进行xx手机号码访问,然后失败了,每次ip过来查询,都调用数据库,查看某段时间内这个ip发送的次数,然后如果超过比如10次就禁止掉。这种注册会频繁调用数据库,试想一下,如果某个ip发送很多数据过来,你本来是调用阿里大鱼接口一次,现在变得需要频繁调用数据。数据库每秒最高不超过2000次查询,这样阿里大鱼接口跟数据库之间要崩溃一个。 中级 引入redis中间件,拿redis当缓存,某个ip进行查询,当失败稍后,进行次数记录,每次查询前,先调用redis中获取对应ip的查询次数,可以设置过期时间,比如某个号码在5分钟内,如果发送10次+,就认为是进行恶意,那么压力就到了redis,这种是比较合理的。 高级,阿里大鱼本身有针对号码的设置,某个号码是否可以频繁发送,当然这种只能针对号码,无法针对ip,所以一般是使用中级的。 之所以说是高级,是因为是阿里大鱼本身提供的,总比自己的更稳健不是 )【当然如果某些恶意破坏,使用多ip进行攻击,这种当初查找过资料,但是基本没有很好的解决办法。原因如下,一个是ip进行攻击,比较随机,你可以禁止某个手机号在短时间内进行校验,也可以禁止某个ip进行,但是不同ip进行访问,没有办法有效判断,另外一半多ip也是需要花钱购买,小公司一般没人那么搞你。另外一种就是人工,类似手机号码的呼死你,发群里,然后一群人进行注册,这种防不住,模拟真实人工注册,不过成本也很大。简称互相伤害吧】
4.用户注册成功了,那么用户进行操作时候,怎么确定是本人。最基本版本是你登录了就验证一次,之后都不验证,一般就当你是普通用户了,这种会导致一些免费功能被别人随意使用,爬虫难度系数极地,直接调用你接口就能用了,因为你只是在登录时候进行校验,在接口不设防
版本2.0 给用户表加上一个token,每次登录就更新token,然后调用接口时候,你的session中放值token,每次调用都对比数据库token是否一致,如果一致认为是当前用户,不一致就要求重新登录,然后重新登录获取最新token。使用也是频繁调用数据库,同理,这种重复事情交给缓存,登录之后对应token放值到redis,并设置8小时的过期时间,redis主要解决一些频繁使用的数据在一次会话中,可以拿来校验。这个大致可以满足线上作用了。当调用接口时候,对应token去redis查询是否存在,如果存在就放行。【伪登录,既然扯到登录,这里可以设置一个伪登录,用户的账号密码是你可以看到账号也就是手机号码,但是密码一般是经过加密,数据库不存放明文密码,为了安全起见,你可以在head放置一个usertoken这样的一个值,当做这个值是某个特殊值时候,运行跳过登录密码校验,直接成功,同理也跳过接口调用验证。好处是某些用户你可以进行一些问题的场景重现,坏处是开发团队的新人不要乱搞,数据已已经是真实数据了,你的操作,会影响到用户的真实体验】
版本3 后续的衍生 以上只是简单的token拿来验证用户身份,可以跟用户角色进行绑定,验证是否有操作权限,以及可以后续集成使用jwt,来进一步让token携带更多信息,不过这部分是了解到的技术拓展,并未应用到线上。