• 2007-05-25

    PHP LDAP连接微软活动目录进行身份验证

    Views: 24594 | 6 Comments

    如果使用活动目录(Active Directory)代替在数据库表中建立账号, 你可以使用原来Windows网络中的账号.

    LDAP, 轻量级目录访问协议(Lightweight Directory Access Protocol), 是用来访问微软的活动目录等目录服务器(DS, Directory Server)的协议. PHP默认支持LDAP.

    下面是使用LDAP进行用户身份验证的PHP程序. 在微软的活动目录中, 用户的唯一标识是"samaccountname", 有些DS是"uid". 方法是:

    1. 用有权限的账号的dn(形如 cn=user_name,ou=web,dc=ideawu,dc=com)连接LDAP Server.
    2. 根据登录用户的名字查询其dn.
    3. 用该dn连接LDAP Server. 如果连接上就是登录成功.

    注意! 微软的活动目录服务器可以使用空账号连接成功(设置问题? 默认? 特例?)!

    $userid = $_POST['userid'];
    $user_password = $_POST['password'];
    
    if($userid && $user_password){
    // config
    // $ldap_server = "ideawu.com";
    // $ldap_admin = "user_name";
    // $ldap_password = "xxx";
    // $base_cn = "ou=web,dc=ideawu,dc=com";
    	$conn = ldap_connect($ldap_server);
    	if(!$conn){
    		die("<br>Connection LDAP server error");
    	}
    	$bind = ldap_bind($conn, $ldap_admin, $ldap_password);
    	if(!$bind){
    		die("<br>Bind LDAP server error");
    	}
    
    	$filter = 'samaccountname=' . $userid;
    	$attributes = array('mail');	
    	$result = ldap_search($conn, $base_dn, $filter, $attributes);
    	$info = ldap_get_entries($conn, $result);
    
    	if(!$result){
    		die("<br>Search failed");
    	}
    
    	if($info["count"] != 0){
    		$user_dn = $info[0]["dn"];
    		unset($bind2);
    		$bind2 = @ldap_bind($conn, $user_dn, $user_password);
    		if($bind2){
    			// Login done. Set session
    		}
    	}
    
    	ldap_close($conn);
    }
    
    Posted by ideawu at 2007-05-25 18:20:49
  • 2007-05-14

    给博客做了换界面风格的功能

    Views: 9678 | No Comments

    今天有空, 就给博客做了换界面风格的功能, 好让大家不会觉得太单调.

    技术上很容易实现, 根据Cookie的某个不同变量选择相应的CSS和图片, 还有就是顶部菜单. 文章阅读因为是生成的静态文件, 所以不受主题选择的影响.

    Posted by ideawu at 2007-05-14 16:25:29
  • 2007-05-07

    对P2P应用不友好的NAT

    Views: 11645 | No Comments

    根据微软的资料, 为了更好的支持peer-to-peer应用, Windows的NAT这样表现:

    If a client on the private network sends UDP packets to two different computers on the public network from the same source port, the NAT driver will use the same source port for both mappings.

    但是, 我遇到一些几十元钱的NAT盒子, 它们并不这样工作. 它们为每一个不同的远端EndPoint分配一个新的外出EndPoint, 一般是上一个端口加1. 这就是Symmetric NAT. 它们仍然执行“loose matching behavior”. 也就是说, 内网(NAT之后)的同一个EndPoint可以拥有多个外出EndPoint. 这对使用基于连接的UDP是个麻烦.

    Posted by ideawu at 2007-05-07 12:07:53
  • 2007-05-06

    滑动窗口机制简单理解

    Views: 17862 | 1 Comment

    这篇文章是对滑动窗口机制的简单理解.

    发送:

    将 snd_wnd(发送窗口大小) 个数据包发送出去, 然后每收到一个确认包便再发送一个, 直到所有的数据包发送完毕. 发送窗口的选择的一个考虑是, 保存已发送但未确认的包所需要的内存. 还有一个考虑是接收方对排序数据包的要求. 还有就是网络硬件的限制.

    接收:

    每收到一个数据包, 便回复一个确认, 然后将收到的数据包排序.

    这简单, 但是问题是, 收到的包的顺序有利与排序吗? 我们希望接收到的每一包都是我们期望的下一个(rcv_nxt), 如果不是, 暂时将它保存. 如果我们使用一个链表来保存收到的包, 那么将包插入到这个链表时, 就要维护它的有序性.

    如果接收到的包太过分散(有相当部分落在接收窗口之外), 那么接收方记录这些包就会消耗更多内存, 排序也会消耗更多的CPU时间和其它资源.

    接收方还要处理重复包的问题.

    这仍然是停止等待机制, 只不过是并发的停止等待. 将微观上的串行转换为宏观上的并行.

    Posted by ideawu at 2007-05-06 22:18:17
  • 2007-05-06

    数据传输中的停止等待机制的实现

    Views: 14258 | No Comments

    停止等待机制是数据传输的最基本机制. 发送方发送一个带有序号的包给对方, 然后在收到确认之后才发出下一个. 停止等待机制的实现简单, 在TFTP协议中使用. 但是它的传输时延与网络时延成正比, 因为当数据在线路上传输的时候, 发送方和接收方什么也不做, 只是等待. 如果需要高的吞吐率, 就应该使用滑动窗口机制(TCP协议使用)等.

    正如前面所说的, 停止等待机制容易实现, 下面给出使用UDP实现停止等待机制的代码:

    // Send data and wait for an ACK. Return bytes sent.
    // If error occurs, return -1;
    int send_packet(int sock, struct Packet *packet, int size){
    	struct tftpx_packet rcv_packet;
    	int time_wait_ack = 0;
    	int rxmt = 0;
    	int r_size = 0;
    
    	for(rxmt = 0; rxmt < PKT_MAX_RXMT; rxmt ++){
    		if(send(sock, packet, size, 0) != size){
    			return -1;
    		}
    		for(time_wait_ack = 0; time_wait_ack < PKT_RCV_TIMEOUT; time_wait_ack += 5000){
    			r_size = recv(sock, &rcv_packet, sizeof(rcv_packet), MSG_DONTWAIT);
    			if(r_size > 4 && rcv_packet.cmd == htons(CMD_ACK) && rcv_packet.seq== packet->seq){
    				// Valid ACK
    				goto send_done;
    			}
    			usleep(5000);
    		}
    		// Retransmission
    	}
    	if(rxmt == PKT_MAX_RXMT){
    		// send timeout
    		printf("Sent packet exceeded PKT_MAX_RXMT.\n");
    		return -1;
    	}
    send_done:
    	return size;
    }
    
    
    Posted by ideawu at 21:35:21
  • 2007-05-04

    精英教育

    Views: 8867 | No Comments

    我的一位老师说, 学校有意向想搞精英教育. 他分析说, 要搞精英教育, 首先老师必须是精英. 但是, 咱们学校现在的情况, 估计要好几十年.

    现在中国已经普及了普通高等教育, 转向精英教育是必然的. 普及教育就是一种公平, 但是事实表明, 普及教育是教学质量是低级的. 当大部分的人都受到普及教育而知识增长, 但是他们的思维却停留不前或者增长太慢时, 他们就会感到困惑和无所事事. 因为他们所做的远远低于能力所及. 这时, 精英教育可以引入竞争和不平衡发展, 让大部分的人有危机感.

    问题是, 我们曾经为了普及教育而竞争, 现在又需要为精英教育而竞争, 这会让不少人无法适应.

    Posted by ideawu at 2007-05-04 10:47:33
|<<<103104105106107108109110111>>>| 107/138 Pages, 825 Results.