用户登录:需要填写用户名,密码,如果在传输的过程中直接用明文,就恨可能被拦截,导致密码泄露,
也就是说,在客户端提交数据之前,应该对数据进行加密,然后在服务器接到加密后的密钥后,在根据解密规则进行解密。
然后 再把揭秘后的 密码 进行 md5 加密,最后和数据库中的数据进行比较。
另外数据库中的密码也应该是加密过的,并且是不可逆的加密(例如md5),防止数据库被攻破后密码全部泄漏。
另外用户名密码数据应该和用户的其他信息分割开来,这样在返回用户信息的时候,不用把用户名密码一起返回。
用户登录成功之后,生成一个用户credential ,可以存入缓存, key = 用户ID + 设备ID + version , credential = used +"|"+时间戳+“|”+随机数 ,
然后返回给客户端,以后客户端每次请求的时候都要带着这个 credential,
如果某个操作需要校验 用户的credential ,就查询一下缓存中是否有 信息,如果没有,让用户重新登录。
用户credential 信息 存在缓存里是有时间限制的,为了让用户不用频繁登录,我们可以开启一个保持登陆的接口,
这个接口里,可以在用户打开app 的时候调用一下,用来更新用户的认证信息。
还有一些配置信息,也可以提供一个接口,让用户打开app 的时候可以调用。
web 端:
登陆过程是一样的,而且认证信息 返回给客户端后,存储位置也一样,都是存储到了cookie 中。
总结:
用户认证和用户权限检查是两回事儿,所以设计起来应该是两个过滤器(拦截器)。
过滤器和拦截器的作用这里是一样的,就是在用户操作之前进行一些判断,只是实现机制不同,
拦截器 实现机制 是反射,过滤器是 函数回调。
过滤器 必须用于 servlet 容器项目,拦截器不是。
web 端 用户认证 阶段 做的事情:
1 从 请求的cookie 中 ,获取 服务器 返回的 认证信息(用户ID,当前时间,用户ID和当前时间的 加密串,给cookie设置有效时间,域名),如果没有,则 告诉用户需要登录,如果有,验证登录信息的准确性,如果不准确,返回给客户端,重新登录,如果准确,
根据用户ID查询 用户信息,如果可以查到,并且用户状态等都是OK 的,则 确定用户登录成功,把用户信息设置到请求的属性中。
2 权限校验:拦截器:
获取请求URL,如果url 在不需要校验权限的列表中,则校验通过,否则,从request 中获取用户信息,根据用户信息获取用户权限信息,
根据当前url 判断 访问资源需要的权限,如果这个权限 在用户拥有的权限列表中,
则代表用户可以访问,否则 用户 不可以访问。
一个简单的安全认证流程
最新推荐文章于 2024-04-17 16:24:37 发布