You are here

DeriveFromEntry.notes.cn.txt in Lightweight Directory Access Protocol (LDAP) 7

This is a counterpart to DeriveFromEntry.notes.txt using cn, groupOfUniqueNames, and uid

========================================
Derive From Entry walk-through NOT nested:
========================================

--- configuration ------
0. authorization.deriveFromEntry = 1
1. authorization.deriveFromEntryEntries = array('it', 'people')
1b. authorization.deriveFromEnryEntryAttribute' = 'cn'
2. authorization.deriveFromEntryMembershipAttr = 'uniquemember'
2a. authorization.deriveFromEntryAttrMatchingUserAttr = 'dn'
4. authorization.deriveFromEntrySearchAll = 0
5. authorization.deriveFromEntryNested = 0
6. authorization.deriveFromEntryUseFirstAttr = 0
7. server.groupObjectClass = 'groupOfUniqueNames'

user ldap entry in question:
  'dn' => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  'cn' => 'joeprogrammer',
  'uid' => 'joeprogrammer',
  'mail' => array( 0 => 'joeprogrammer@myuniversity.edu'),
  'uid' => array( 0 => 'joeprogrammer'),


--- walk-through ------
1). foreach base dn, execute the following query:

(&
(objectClass=groupOfUniqueNames)
(|(cn=it)(cn=people))
(uniquemember=cn=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu)
)

in psuedo code:
(&
(objectClass=[server.groupObjectClass])
(|([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[i]])...([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[n]]))
([authorization.deriveFromEntryMembershipAttr]=[user_ldap_entry[deriveFromEntryAttrMatchingUserAttr]])
)


2. All entries returned represent groups that user is a member of.
Their DNs are added to the list of authorizations or the first attribute value
if authorization.deriveFromEntryUseFirstAttr is true.


========================================
Derive From Entry walk-through NESTED:
========================================

--- configuration ------
0. authorization.deriveFromEntry = 1
1. authorization.deriveFromEntryEntries = array('it', 'people')
1b. authorization.deriveFromEnryEntryAttribute' = 'cn'
2. authorization.deriveFromEntryMembershipAttr = 'uniquemember'
2b. authorization.deriveFromEntryAttrMatchingUserAttr = 'dn'
4. authorization.deriveFromEntrySearchAll = 0
5. authorization.deriveFromEntryNested = 1
6. authorization.deriveFromEntryUseFirstAttr = 0
7. server.groupObjectClass = 'groupOfUniqueNames'

user ldap entry in question:
  'dn' => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  'mail' => array( 0 => 'joeprogrammer@myuniversity.edu'),
  'uid' => array( 0 => 'joeprogrammer'),


--- walk-through ------
1). foreach base dn, execute the following query:

(&
(objectClass=groupOfUniqueNames)
(|(cn=it)(cn=people))
)

in psuedo code:
(&
(objectClass=[server.groupObjectClass])
(|([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[i]])...([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[n]]))
)


2. All entries returned represent groups that user MIGHT be a member of.  examples:

  'dn' => 'cn=it,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  'cn' => array( 0 => 'it'),
  'objectclass' => array( 0 => 'groupofuniquenames'),
  'uniquemember' => array(
    0 => 'developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    2 => 'uid=joeprojectmanager,ou=it,dc=ad,dc=myuniversity,dc=edu',
  ),

  'dn' => 'cn=people,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  'cn' => array( 0 => 'people'),
  'objectclass' => array( 0 => 'groupofuniquenames'),
  'uniquemember' => array(
     0 => 'cn=students,cn=groups,dc=ad,dc=myuniversity,dc=edu',
     1 => 'cn=staff,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  ),




3. foreach returned entry from query 1. (authorization.deriveFromEntryEntries):

  if 'uniquemember' contains a value matching 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu', add that entry's DN to authorizations
  in psuedo code: if group[authorization.deriveFromEntryMembershipAttr] contains user[authorization.deriveFromEntryAttrMatchingUserAttr],
  add corresponding authorization.deriveFromEntryEntries entry to authorizations


  else recurse through uniquemembers.  if user's entry is found, add corresponding
  authorization.deriveFromEntryEntries entry to authorizations


4A.  recursion:

In the above example the first recursion query looks like:
(&
  (objectClass=groupofuniquenames)
  (|
    (cn=developers)
    (cn=sysadmins)
    (cn=joeprojectmanager)
  )
)

which might return:

    'dn' => 'cn=developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    'cn' => array( 0 => 'developers'),
    'objectclass' => array( 0 => 'groupofuniquenames'),
    'uniquemember' => array(
      0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
    ),

    'dn' => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    'cn' => array( 0 => 'sysadmins'),
    'objectclass' => array( 0 => 'groupofuniquenames'),
    'uniquemember' => array(
      0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
      1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    ),

since uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu is found in the first entry,
  "it" (the ancestor group) is added to the list of authorizations.


4B.  In the above example the second recursion query would look like:

(&
  (objectClass=groupofuniquenames)
  (|
    (cn=students)
    (cn=staff)
  )
)

which returns:

    'dn' => 'cn=staff,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    'cn' => array( 0 => 'staff'),
    'objectclass' => array( 0 => 'groupofuniquenames'),
    'uniquemember' => array(
      0 => 'cn=it,cn=groups,dc=ad,dc=myuniversity,dc=edu',
      1 => 'uid=unkool,ou=lost,dc=ad,dc=myuniversity,dc=edu',
    ),


    'dn' => 'cn=students,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    'cn' => array( 0 => 'students'),
    'objectclass' => array( 0 => 'groupofuniquenames'),
    'uniquemember' => array(
      0 => 'uid=jdoe,ou=campus accounts,dc=ad,dc=myuniversity,dc=edu',
    ),

4C. leading to the queries:

(&
  (objectClass=groupofuniquenames)
  (|
    (cn=jdoe)
  )
)
...which returns no entries

and
4D.
(&
  (objectClass=groupofuniquenames)
  (|
    (cn=it)
    (cn=unkool)
  )
)

which returns:

  'dn' => 'cn=it,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  'cn' => array( 0 => 'it'),
  'objectclass' => array( 0 => 'groupofuniquenames'),
  'uniquemember' => array(
    0 => 'cn=developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
    2 => 'uid=joeprojectmanager,ou=it,dc=ad,dc=myuniversity,dc=edu',
  ),

4E. leading to the query:

  (&
    (objectClass=groupofuniquenames)
    (|
      (cn=developers)
      (cn=sysadmins)
      (cn=joeprojectmanager)
    )
  )

which returns:

  'dn' => 'cn=developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  'cn' => array( 0 => 'developers'),
  'objectclass' => array( 0 => 'groupofuniquenames'),
  'uniquemember' => array(
    0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  ),

  'dn' => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  'cn' => array( 0 => 'sysadmins'),
  'objectclass' => array( 0 => 'groupofuniquenames'),
  'uniquemember' => array(
    0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
    1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  ),

since uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu is found in the first entry,
"people" (the ancestor group) is added to the list of authorizations.

==================================================================

File

ldap_authorization/tests/DeriveFromEntry/DeriveFromEntry.notes.cn.txt
View source
  1. This is a counterpart to DeriveFromEntry.notes.txt using cn, groupOfUniqueNames, and uid
  2. ========================================
  3. Derive From Entry walk-through NOT nested:
  4. ========================================
  5. --- configuration ------
  6. 0. authorization.deriveFromEntry = 1
  7. 1. authorization.deriveFromEntryEntries = array('it', 'people')
  8. 1b. authorization.deriveFromEnryEntryAttribute' = 'cn'
  9. 2. authorization.deriveFromEntryMembershipAttr = 'uniquemember'
  10. 2a. authorization.deriveFromEntryAttrMatchingUserAttr = 'dn'
  11. 4. authorization.deriveFromEntrySearchAll = 0
  12. 5. authorization.deriveFromEntryNested = 0
  13. 6. authorization.deriveFromEntryUseFirstAttr = 0
  14. 7. server.groupObjectClass = 'groupOfUniqueNames'
  15. user ldap entry in question:
  16. 'dn' => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  17. 'cn' => 'joeprogrammer',
  18. 'uid' => 'joeprogrammer',
  19. 'mail' => array( 0 => 'joeprogrammer@myuniversity.edu'),
  20. 'uid' => array( 0 => 'joeprogrammer'),
  21. --- walk-through ------
  22. 1). foreach base dn, execute the following query:
  23. (&
  24. (objectClass=groupOfUniqueNames)
  25. (|(cn=it)(cn=people))
  26. (uniquemember=cn=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu)
  27. )
  28. in psuedo code:
  29. (&
  30. (objectClass=[server.groupObjectClass])
  31. (|([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[i]])...([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[n]]))
  32. ([authorization.deriveFromEntryMembershipAttr]=[user_ldap_entry[deriveFromEntryAttrMatchingUserAttr]])
  33. )
  34. 2. All entries returned represent groups that user is a member of.
  35. Their DNs are added to the list of authorizations or the first attribute value
  36. if authorization.deriveFromEntryUseFirstAttr is true.
  37. ========================================
  38. Derive From Entry walk-through NESTED:
  39. ========================================
  40. --- configuration ------
  41. 0. authorization.deriveFromEntry = 1
  42. 1. authorization.deriveFromEntryEntries = array('it', 'people')
  43. 1b. authorization.deriveFromEnryEntryAttribute' = 'cn'
  44. 2. authorization.deriveFromEntryMembershipAttr = 'uniquemember'
  45. 2b. authorization.deriveFromEntryAttrMatchingUserAttr = 'dn'
  46. 4. authorization.deriveFromEntrySearchAll = 0
  47. 5. authorization.deriveFromEntryNested = 1
  48. 6. authorization.deriveFromEntryUseFirstAttr = 0
  49. 7. server.groupObjectClass = 'groupOfUniqueNames'
  50. user ldap entry in question:
  51. 'dn' => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  52. 'mail' => array( 0 => 'joeprogrammer@myuniversity.edu'),
  53. 'uid' => array( 0 => 'joeprogrammer'),
  54. --- walk-through ------
  55. 1). foreach base dn, execute the following query:
  56. (&
  57. (objectClass=groupOfUniqueNames)
  58. (|(cn=it)(cn=people))
  59. )
  60. in psuedo code:
  61. (&
  62. (objectClass=[server.groupObjectClass])
  63. (|([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[i]])...([authorization.deriveFromEnryEntryAttribute]=[authorization.deriveFromEntryEntries[n]]))
  64. )
  65. 2. All entries returned represent groups that user MIGHT be a member of. examples:
  66. 'dn' => 'cn=it,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  67. 'cn' => array( 0 => 'it'),
  68. 'objectclass' => array( 0 => 'groupofuniquenames'),
  69. 'uniquemember' => array(
  70. 0 => 'developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  71. 1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  72. 2 => 'uid=joeprojectmanager,ou=it,dc=ad,dc=myuniversity,dc=edu',
  73. ),
  74. 'dn' => 'cn=people,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  75. 'cn' => array( 0 => 'people'),
  76. 'objectclass' => array( 0 => 'groupofuniquenames'),
  77. 'uniquemember' => array(
  78. 0 => 'cn=students,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  79. 1 => 'cn=staff,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  80. ),
  81. 3. foreach returned entry from query 1. (authorization.deriveFromEntryEntries):
  82. if 'uniquemember' contains a value matching 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu', add that entry's DN to authorizations
  83. in psuedo code: if group[authorization.deriveFromEntryMembershipAttr] contains user[authorization.deriveFromEntryAttrMatchingUserAttr],
  84. add corresponding authorization.deriveFromEntryEntries entry to authorizations
  85. else recurse through uniquemembers. if user's entry is found, add corresponding
  86. authorization.deriveFromEntryEntries entry to authorizations
  87. 4A. recursion:
  88. In the above example the first recursion query looks like:
  89. (&
  90. (objectClass=groupofuniquenames)
  91. (|
  92. (cn=developers)
  93. (cn=sysadmins)
  94. (cn=joeprojectmanager)
  95. )
  96. )
  97. which might return:
  98. 'dn' => 'cn=developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  99. 'cn' => array( 0 => 'developers'),
  100. 'objectclass' => array( 0 => 'groupofuniquenames'),
  101. 'uniquemember' => array(
  102. 0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  103. ),
  104. 'dn' => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  105. 'cn' => array( 0 => 'sysadmins'),
  106. 'objectclass' => array( 0 => 'groupofuniquenames'),
  107. 'uniquemember' => array(
  108. 0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  109. 1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  110. ),
  111. since uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu is found in the first entry,
  112. "it" (the ancestor group) is added to the list of authorizations.
  113. 4B. In the above example the second recursion query would look like:
  114. (&
  115. (objectClass=groupofuniquenames)
  116. (|
  117. (cn=students)
  118. (cn=staff)
  119. )
  120. )
  121. which returns:
  122. 'dn' => 'cn=staff,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  123. 'cn' => array( 0 => 'staff'),
  124. 'objectclass' => array( 0 => 'groupofuniquenames'),
  125. 'uniquemember' => array(
  126. 0 => 'cn=it,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  127. 1 => 'uid=unkool,ou=lost,dc=ad,dc=myuniversity,dc=edu',
  128. ),
  129. 'dn' => 'cn=students,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  130. 'cn' => array( 0 => 'students'),
  131. 'objectclass' => array( 0 => 'groupofuniquenames'),
  132. 'uniquemember' => array(
  133. 0 => 'uid=jdoe,ou=campus accounts,dc=ad,dc=myuniversity,dc=edu',
  134. ),
  135. 4C. leading to the queries:
  136. (&
  137. (objectClass=groupofuniquenames)
  138. (|
  139. (cn=jdoe)
  140. )
  141. )
  142. ...which returns no entries
  143. and
  144. 4D.
  145. (&
  146. (objectClass=groupofuniquenames)
  147. (|
  148. (cn=it)
  149. (cn=unkool)
  150. )
  151. )
  152. which returns:
  153. 'dn' => 'cn=it,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  154. 'cn' => array( 0 => 'it'),
  155. 'objectclass' => array( 0 => 'groupofuniquenames'),
  156. 'uniquemember' => array(
  157. 0 => 'cn=developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  158. 1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  159. 2 => 'uid=joeprojectmanager,ou=it,dc=ad,dc=myuniversity,dc=edu',
  160. ),
  161. 4E. leading to the query:
  162. (&
  163. (objectClass=groupofuniquenames)
  164. (|
  165. (cn=developers)
  166. (cn=sysadmins)
  167. (cn=joeprojectmanager)
  168. )
  169. )
  170. which returns:
  171. 'dn' => 'cn=developers,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  172. 'cn' => array( 0 => 'developers'),
  173. 'objectclass' => array( 0 => 'groupofuniquenames'),
  174. 'uniquemember' => array(
  175. 0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  176. ),
  177. 'dn' => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  178. 'cn' => array( 0 => 'sysadmins'),
  179. 'objectclass' => array( 0 => 'groupofuniquenames'),
  180. 'uniquemember' => array(
  181. 0 => 'uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu',
  182. 1 => 'cn=sysadmins,cn=groups,dc=ad,dc=myuniversity,dc=edu',
  183. ),
  184. since uid=joeprogrammer,ou=it,dc=ad,dc=myuniversity,dc=edu is found in the first entry,
  185. "people" (the ancestor group) is added to the list of authorizations.
  186. ==================================================================