'首先限制用户组的最大值。例如该系统最多允许有1000个用户组。一个系统的功能可能会很多,但是用户组的数量一般不可能超过1000个吧! 

'建立一个功能权限分配表,树型或线性的都可以。表的字段为 LX_SR ( sr_id , sr_name , sr_rgt ) id是功能ID,name是功能名称,rgt为权限字符串。 

'其中,权限字符串的设定如下: 
'一个十六进制的F可以转为4个二进制的1,那么每个1就代表一个用户组ID,例如用户组ID为3,那么就读取二进制字符串中的第三个位置是否为1,就能判断该用户组是否有某功能的权限。这样一来Access的一个字符串字段就可以保存1000个用户组ID的权限值。并且规定一个用户必须只能从属于一个用户组,假如一个用户想要拥有两个用户组的权限,那么就新建一个用户组具有某两个用户组的权限的,然后再把用户分配到新的用户组。 

'示例数据: 
'id        name           rgt 
'1        文章查询        10D30D15FFB7F6AF9EAB3FFD2 
'2        文章添加        5406315833FB3AE2C2DF73206 
'3        文章删除        5C3ACBEF4BBE1F8D39FDA4776 
'4        文章修改        8313D105775D1FA45B46AD484 
'5        文章审核        08FE71724C475BA18FDCF590C 
'6        新闻查询        5406315833FB3AE2C2DF73206 
'7        新闻添加        8639638B551D6C05F40196539 
'8        新闻删除        B646F3389A8F42D78E78D06A7 
'9        新闻修改        2B21A4956E6A8ED4B20E27C2F 
'10       新闻审核        29701B1352CEFE079B488DEFD 


'有关代码如下: 
'[code] 
'将十六进制的字符串转为二进制(可能用不上) 
'例如: 
'输入为"1",输出为"1000" 
'输入为"2",输出为"0100" 
'输入为"3",输出为"1100" 
Function StrRev16To2(x) 
     Dim b(3), o, i, l, t, c 
     On Error Resume Next 
     l = Len(x) 
     If l = 0 Then Exit Function 
     ReDim o(l - 1) 
     For i = 1 To l 
           t = CInt("&H" & Mid(x, i, 1)) 
           If t >= 8 Then 
                 t = t - 8: b(3) = 1 
           Else 
                 b(3) = 0 
           End If 
           If t >= 4 Then 
                 t = t - 4: b(2) = 1 
           Else 
                 b(2) = 0 
           End If 
           If t >= 2 Then 
                 t = t - 2: b(1) = 1 
           Else 
                 b(1) = 0 
           End If 
           If t >= 1 Then 
                 t = t - 1: b(0) = 1 
           Else 
                 b(0) = 0 
           End If 
           o(i - 1) = Join(b, "") 
     Next 
     StrRev16To2 = Join(o, "") 
     On Error GoTo 0 
End Function 
'将二进制的字符串转为十六进制 
'主要用于将接收的Request.Form("checkbox")值,转换并存储到数据库的字段中 
Function StrRev2To16(x) 
     Dim b, o, i, l, m 
     On Error Resume Next 
     l = Len(x) 
     If l = 0 Then Exit Function 
     m = l Mod 4 
     If m <> 0 Then x = x & String(4 - m, "0"): l = Len(x) 
     For i = 1 To l Step 4 
           b = 0 
           If Mid(x, i, 1) = 1 Then b = b + 1 
           If Mid(x, i + 1, 1) = 1 Then b = b + 2 
           If Mid(x, i + 2, 1) = 1 Then b = b + 4 
           If Mid(x, i + 3, 1) = 1 Then b = b + 8 
           o = o & Hex(b) 
     Next 
     StrRev2To16 = o 
     On Error GoTo 0 
End Function 
'当一个用户登录系统时,例如该用户所在的用户组的ID为22,那么只需执行以下SQL语句 

' SQL="SELECT sr_id, sr_name FROM LX_SR WHERE " & RoleIDtoSQL(22, "sr_rgt") 

'以上SQL将返回: 
'sr_id    sr_name 
'3      文章删除 
'7      新闻添加 
'8      新闻删除 
'10     新闻审核 

'其中的WHERE后面的子句就是用下面的函数生成的了。然后根据此结果生成后台的功能菜单或功能树型列表。顺便将此列表用Session或Cookie保存,以后每访问一个页面就可以读取出来判断是否有权访问。 
Function RoleIDtoSQL(ID, f) 
      
     Dim a, b, m, s 
      
     a = ID Mod 4 
     If a = 0 Then a = 4 
     m = (ID - 1) \ 4 
      
     If m = 0 Then 
          b = "" 
     Else 
          b = String(m, "_") 
     End If 
      
     Select Case a 
     Case 1 
          s = "13579BDF" 
     Case 2 
          s = "2367ABEF" 
     Case 3 
          s = "4567CDEF" 
     Case 4 
          s = "89ABCDEF" 
     End Select 
     s= f & " LIKE '" & b & "[" & s & "]%'" 
      
     RoleIDtoSQL = s 
End Function 
'[/code]