现阶段的主要矛盾是落后的生产力不能满足日益增长的物质文化需求

注册 | 登陆

基于令牌的通行证

晚天搞到三点多,把ZF默认的目录结构做了一些修改,配置一些文件,放到SVN中

以前扯淡过一次通行证,不过当时知道的比较少,这次再扯一次,
通行证,我知道有两种,一种是cookie加密,一种是memcached做的令牌

1. cookie 小站用的比较多,问题是不支持分布,也不能解决多地登录,在不在线,还有不能放太大的数据量,毕竟每次请求都附上cookie。

2. 令牌可以解决cookie的一些问题,很多网站都在用,好处就是支持分布式,N个应用都可以自由判断用户登录没登,不好的地方的是保持不方便。
令牌一般有两组,一组只保存很少的信息:用户ID=>(登录时间,客户端IP),这个是用来快速判断。
另一组才是真正的令牌:md5(用户id+登录时间)=>其它信息,用户每次登录都会刷新这个令牌。

想过用memory表,效率太差,比较好的方法是把这两个结合起来:
在线的用户会放在memcached中,假设设置时间是60m, 过期就是不在线,可以解决在线问题。
用户本地有cookie, 如果解密成功且memcached中没有用户信息则设置,此时同一用户可以多地登录的。
如果应用程序要求比较严格,不允许多地登录,则可以用memcached中保存的客户端信息来确定当前唯一登录用户。
在线保持还会有一个效率问题,因为要刷新在线时间,保持状态,不过比较好解决,简单的就是设置长一点过期时间和随机刷新。

总体上来说:
cookie: (rc4或xxtea) 用户ID, 登录时间戳
memcache第一组:用户ID=>(登录时间,客户端IP(更严格一点可以包括浏览器信息))
memcache第二组:md5(用户id+登录时间)=>其它信息

这样做有一个很不好的地方,增加了其它应用判断是否登录的复杂度,以前只要检测memcached就可以了,现在还要检查一下cookie, 不过借助于js的还是比较容易解决。

另外,这样会有一些安全问题,比如用户改了密码以后,原来的cookie还能用,这个问题解决应该和全站安全一起考虑,用户在注册的时候随机生成的key,位数可以少一点,这个key是用来确认客户端cookie有效的,也可以用来防止跨站请求伪造,也可以md5的时候加上,形成双密码保护,功能多多。。

Tags: 通行证

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8

发表评论

评论内容 (必填):