免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6572 | 回复: 15
打印 上一主题 下一主题

[ldap] 求救:OpenLDAP中的访问控制关于正则表达式的问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-07 21:22 |只看该作者 |倒序浏览
本人在分析openldap过程中,根据有关资料,对访问控制有了一定了解.现遇到有关正则表达式的问题,恳请高手不吝赐教,谢谢!
问题如下:
  目的:使数据库中所有dn为"ou=***,……"的entry能够被他的子孙所读
  例子:假设目录数据库中的整体结构如下图:
    c=IBM
                 ou=Accounting
                      cn=Bob
                      cn=Tom
                      cn=Rose
                 ou=Product Departmen
                 ou=Management
                 ou=Human Resources
       如果我以cn=Bob的身份登陆,便可以读"ou=Accounting"的信息.
  于是我在配置文件slapd.conf中设置为:
  ……
  access   to    dn.regex="^ou=([^,]+),c=IBM"
                    by   dn.regex="ou=$0,c=IBM"   read
                    by    *   none    break
      access    to    *
                    by    self      write
                    by    annonymous     auth
                    by    *    none
       但不能达到目的.
  通过LDAPBrowser,以用户cn=Bob登陆,查看不到任何信息.


  另附:
  如果希望每个父结点(entry)都能够具有对其子树中所有子孙的写权限,可在配置文件slapd.conf中输入设置:
  access   to   dn.regex="^.*,ou=([^,]+),c=IBM"
                   by   dn.regex="^ou=$1,c=IBM"    write
                   by   *    none   break
      access   to   *
                   by   self    write
                   by   annonymous     auth
                   by   *   none
      然后启动服务进程slapd,通过LDAPBrowser,以ou=Accounting的身份登陆,可以看到并修改ou=Accounting整个子树,而看不到其他的ou=***.


现在我的目的是希望:
  任何以"cn=***"身份登陆的用户,只能看到本单位的信息和修改自己的信息.而看不到其他任何人和单位的信息,即他的视图应为:
  c=IBM
            ou=Accounting
                   cn=***
  任何以"ou=***"身份登陆的用户,可以看到并修改他整个子树的信息,即他的视图应为:(以ou=Accounting为例)
  c=IBM
            ou=Accounting
                   cn=Bob
                   cn=Tom
                   cn=Rose
现后者问题已经解决,但前者,也就是允许任何ou=***的目录项被他的子孙以读的权限进行访问,还没有解决,恳求高手赐教.
  谢谢.

论坛徽章:
0
2 [报告]
发表于 2005-05-09 09:49 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

请问by   dn.regex="ou=$0,c=IBM"   read
中的$0是什么意思

论坛徽章:
0
3 [报告]
发表于 2005-05-09 13:59 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

这个地方牵涉到几个函数:
regcomp()
regexec()
parse_acl()
access_allowed()
我简单叙述一下:
在parse_acl()中解析配置文件slapd.conf中的访问策略语句,当读到"^ou=([^,]+),c=IBM$"时,调用函数regcomp()进行正则表达式编译,把编译结果保存在一个regex_t的数据结构(全局变量)当中,在regcomp()中有一个参数是pmatch[],它是一个数组,元素为regmatch_t{rm_so,rm_eo}.pmatch[]保存的是正则表达式的开始和终结位置,在例中pmatch[0]保存的就是匹配
([^,]+)的位置,例如"ou=Accounting,c=IBM"是匹配的,则pmatch[0]保存的值为(4,14)

在访问权限判别函数access_allowed()函数中,调用regexec()函数来进行模式匹配,就要用到参数pmatch[],因为可能有多处需要进行匹配(本例中只有一处,pmathc[0]),在配置文件中输入访问策略语句时的语法就应当写为"$0"

在后面的例子中"^.*,ou=([^,]+),c=IBM$"有两处正则表达式的匹配,所以有pmatch[0]和pmatch[1],而我们只要求匹配一处,即pmatch[1],所以后面例子的访问策略语句为"by  dn.regex="^ou=$1,c=IBM$"

论坛徽章:
0
4 [报告]
发表于 2005-05-09 14:01 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

access   to    dn.regex="^ou=([^,]+),c=IBM"
                   by   dn.regex=".*,ou=$1,c=IBM"   read
                   by    *   none    break
     access    to    *
                   by    self      write
                   by    annonymous     auth
                   by    *    none

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2005-05-09 16:00 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

对ACL很感兴趣,我帮你置顶,让大家都来试试吧。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2005-05-09 16:49 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

以前没见过“$0”这样的写法,应该是从$1开始,并且是用()中的内容做的替换。
楼主看的是哪里的资料?

论坛徽章:
0
7 [报告]
发表于 2005-05-09 21:56 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

谢谢大家支持,回帖.
今天这个问题已经解决了.
正确写法应为:
access to dn.regex="^ou=([^,]+),c=IBM"
            by dn.regex="ou=$1,c=IBN"  read
            by *none break
……

或者更加通用一点,可写为:
access to dn.regex="^ou=([^,]+),(.*)$"
            by dn.regex="ou=$1,$2"  read
            by * none
……

出错的原因是因为我忽略了"^"也是正则表达式,$0存储的是"^",而不是ou="***"中的内容.

第四楼的版友给的答案也是对的.
另外感谢二楼版友的提问,让我留心到了自己犯的错误.
五楼的版友我不赞同你的观点,原因上面已经说明白,可以一起讨论呀!
呵呵
这个问题困扰我很久了,如鲠在喉,没想到一到这里发了张贴突然就想通了,
我以后会常来的.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2005-05-09 23:54 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

匹配的变量范围是$1到$9
匹配只对括号中的内容有效.
正则表达式是通用的,在perl、vi里也是一样
举个例子:
# assume supplied dn ou=something,cn=my name,dc=example,dc=com
# then $1 = my name at end of match below
# because first expression does not have ()
access to dn="ou=[^,]+,cn=([^,]+),dc=example,dc=com"
by dn.exact="cn=$1,dc=example,dc=com"

楼主如果有兴趣可以试试看

论坛徽章:
0
9 [报告]
发表于 2005-05-10 09:36 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

谢谢PV兄.
你说的是对的.
关于正则表达式我也是刚看不到一个月,阅读了不少资料,未免有囫囵吞枣之嫌,
感谢你的指正.
顺便再问个问题:
那$0到底有什么用??
它指代什么??
因为我在分析OpenLDAP源代码的函数string_expand()中发现:
它允许$0-9的出现,即允许存在,那他如果存在,代表什么呢???

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2005-05-10 09:47 |只看该作者

求救:OpenLDAP中的访问控制关于正则表达式的问题.

string_expand()函数的问题我不太清楚,一直在用openldap,但对internal的东西没有什么了解。你的问题可以到C版上问问看,以前我的一个UTF8的问题就在那里解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP