Submitted by gouki on 2008, August 2, 8:14 PM
目的:
对目前已有的 Web 应用系统,和将来待开发的 Web 应用系统进行集成,实现单点登录。
要求:
- 对已有的 Web 应用系统不作大规模改造。
- 不限制待开发的 Web 应用系统的开发工具。
- 不增加待开发系统的开发难度。
分析:
- 目前,已有的系统都各自维护自己的一套用户库,每个系统中的用户数、用户名、密码几乎都各不相同。要将已有的用户库进行统一是不现实的。因此,我们可以通过将单点登录系统中的用户与其它个系统中的用户建立映射,来实现用一个帐号来管理多个系统的目的。
- 已 有的 Web 应用系统、以及待开发的 Web 应用系统,可能不在同一个域下,虽然会话本身是保存在服务器端,但是会话 id 是需要 cookie 来传递的,而 cookie 不允许跨域访问,而且考虑到各个系统的开发工具也各不相同,即使在同一个域下,不同的开发工具所开发的应用程序之间也很难共享会话,因此要用共享会话的方 式来实现单点登录也不现实。因此我们通过在客户端浏览器、单点登录系统和 Web 应用系统之间传递临时会话,并让 Web 应用系统直接到单点登录系统中获取认证信息来实现单点登录。为保证不同开发工具都能够到单点登录系统获取认证信息,我们采用 xml-rpc 在 Web 应用系统和单点登录系统之间进行通讯。
实现:
单点登录系统中设置 4 个表:
- 单点登录系统用户表,包含 user_id,name,password 3 个字段。
- Web 应用系统表,包含 app_id,name(Web 应用系统名称),checkurl(Web 应用系统中用来验证用户登录的程序地址) 3 个字段。
- 单点登录系统用户到各个 Web 应用系统的用户映射表,包含id,user_id,app_id,name,password 5 个字段。
- 临时会话表,包含 hash(临时会话的 hash 编号),id(对应单点登录系统用户到各个 Web 应用系统的用户映射表中的 id 字段) 2个字段。
用户登录单点登录系统时,通过单点登录系统用户表中的字段来验证用户身份。登录以后,用户可以设置各个系统到该系统用户的映射关系。设置好以后,当通过该 系统进入其他某个 Web 应用系统时,该系统会为该用户和该系统生成一个临时会话编号(hash),并转到 Web 应用系统中的登录检测页面,登录检测页面通过获取到的临时会话编号,来调用单点登录系统的获取用户名和密码的 xml-rpc API,如果用户名密码如果正确,则转到正常登录后的页面,如果不正确,则转到登录错误的页面。这里,xml-rpc API 在返回用户名和密码后,将删除单点登录系统数据库中相应的临时会话,这样不但用户名、密码都是在服务器之间进行传递的,并且临时会话存在的时间也是尽可能 的短,因此只要保证服务器之间的对话不能被监听,即可保证安全性。 已有系统需要增加一个用于单点登录系统的登录验证页面,该页面工作过程大致如下:
- 获取 客户端 hash 值
- 通过 hash 值得到用户名和密码(xml-rpc 调用)
- 通过用户名和密码进行身份验证
- 返回身份验证后的页面
原作者:andot,来源coolcode.cn,原文:http://www.coolcode.cn/show-89-1.html
Tags: 登录, 设计, 通行证
PHP | 评论:0
| 阅读:24031
Submitted by gouki on 2008, August 2, 8:12 PM
闲来无事,到coolcode.cn上去闲逛。发现了一些比较旧的文章,以前也都看过,但,那时候没有开博,所以也就没有记录。如今博客也开了,coolcode.cn估计要成为我搜刮的对象了。
coolcode.cn的作者是andot,PHPRPC的作者,我06年年中(应该没记错)就使用了这个软件,同年放弃使用xajax,当然,现在我更多的使用jquery来操作ajax,但PHPRPC的功能不完全局限于ajax,我这里就不详谈了。先谈这篇文章。。。
无耻的分隔线:
原来,在从 PHP 中直接传递字符串给 JavaScript 时,直接用了 addcslashes,如果传递的是带有 utf-8 编码汉字的,就用 "\0..\037\042\134",如果纯 ascii 范围内的字符串,就用 "\0..\037\042\134\177..\377"。但是今天在写加密程序时发现,发现程序有时行,有时不行。后来发现原来是 \v \a 搞的。addcslashes 会把 \007..\015(八进制) 转义成 \a\b\t\n\v\f\r,而其中 \a 这个 IE 和 Firefox 都不认识,\v 这个 Firefox 认识,IE 不认识。所以我写了下面这个函数,用它可以就可以转化成 JavaScript/JScript 所认识的字符串了(其中 $flag 表示是否转义 ascii 码大于 127 的字符)。感谢五帝同学的帮助!
PHP代码
-
- function addjsslashes($str, $flag = true)
- {
- if ($flag) {
- $str = addcslashes($str, "\0..\006\010..\012\014..\037\042\047\134\177..\377");
- }
- else {
- $str = addcslashes($str, "\0..\006\010..\012\014..\037\042\047\134");
- }
- return str_replace(
- array(chr(7), chr(11)),
- array('\007', '\013'),
- $str
- );
- }
Tags: php, javascript, 进制转换
PHP | 评论:0
| 阅读:22544
Submitted by gouki on 2008, August 2, 8:07 PM
单位用的数据库一直是MYSQL4,这有历史原因,这里就不讨论了。虽然一直想升为MYSQL5,但谁也不能预期升上来之后会有什么问题。也就导致一直不敢升级,但随着数据库的压力越来越大,以及新版本的功能越来越有意义的时候,升级这种事情就被提上了日程,正好看到这篇文章,估计以后可能会遇到同样的问题,因此先记下来,同时也可以给其他朋友一个解决方法。
原文作者:andot,网址:http://www.coolcode.cn/show-155-1.html
» 阅读全文
Tags: mysql, database, blob, insert
DataBase | 评论:0
| 阅读:34137
Submitted by gouki on 2008, August 2, 8:03 PM
PHP 序列化(serialize)格式详解
- 前言
- 概述
- NULL 和标量类型的序列化
- 简单复合类型的序列化
- 嵌套复合类型的序列化
- 自定义对象序列化
- Unicode 字符串的序列化
- 参考文献
原文来自Coolcode.cn,作者andot
» 阅读全文
Tags: php tutorials, serialize
PHP | 评论:1
| 阅读:41125
Submitted by gouki on 2008, August 2, 7:56 PM
什么是Base64?
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列 的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
为什么要使用Base64?
在设计这个编码的时候,我想设计人员最主要考虑了3个问题:
1.是否加密?
2.加密算法复杂程度和效率
3.如何处理传输?
加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是“防君子不防小人”。即达到一眼望去完全看不出内容即可。
基 于这个目的加密算法的复杂程度和效率也就不能太大和太低。和上一个理由类似,MIME协议等用于发送Email的协议解决的是如何收发Email,而并不 是如何安全的收发Email。因此算法的复杂程度要小,效率要高,否则因为发送Email而大量占用资源,路就有点走歪了。
但 是,如果是基于以上两点,那么我们使用最简单的恺撒法即可,为什么Base64看起来要比恺撒法复杂呢?这是因为在Email的传送过程中,由于历史原 因,Email只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通 过有“历史问题”的网关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送Email,这个问题就必须 考虑!所以,单单靠改变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046。
基于以上的一些主要原因产生了Base64编码。
» 阅读全文
Tags: base64, 算法
Javascript | 评论:0
| 阅读:25677