2012/6/30  <fha...@apache.org>:
> Author: fhanik
> Date: Sat Jun 30 01:04:59 2012
> New Revision: 1355615
>
> URL: http://svn.apache.org/viewvc?rev=1355615&view=rev
> Log:
> With more and more use of RFC 2307 http://tools.ietf.org/html/rfc2307
> There is a new way to search for roles using the memberUid that can contain 
> the value of another attribute within the users directory entry.
> This may not be very specific to 2307, but that is where I see this 
> combination of role searches occur the most.
>
> Example: http://www.openldap.org/lists/openldap-technical/200904/msg00024.html
>
>
>
>
> Modified:
>     tomcat/trunk/java/org/apache/catalina/realm/JNDIRealm.java
>     tomcat/trunk/webapps/docs/config/realm.xml
>
> Modified: tomcat/trunk/java/org/apache/catalina/realm/JNDIRealm.java
> URL: 
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/realm/JNDIRealm.java?rev=1355615&r1=1355614&r2=1355615&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/realm/JNDIRealm.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/realm/JNDIRealm.java Sat Jun 30 
> 01:04:59 2012
> @@ -126,8 +126,9 @@ import org.ietf.jgss.GSSCredential;
>   *         property.</li>
>   *     <li>The <code>roleSearch</code> pattern optionally includes pattern
>   *         replacements "{0}" for the distinguished name, and/or "{1}" for
> - *         the username, of the authenticated user for which roles will be
> - *         retrieved.</li>
> + *         the username, and/or "{2}" the value of the userRoleAttribute
> + *         attribute from the users entry, of the authenticated user
> + *         for which roles will be retrieved.</li>
>   *     <li>The <code>roleBase</code> property can be set to the element that
>   *         is the base of the search for matching roles.  If not specified,
>   *         the entire context will be searched.</li>
> @@ -292,6 +293,14 @@ public class JNDIRealm extends RealmBase
>       */
>      protected String userPassword = null;
>
> +    /**
> +     * The name of the attribute inside the users
> +     * directory entry where the value will be
> +     * taken to search for roles
> +     * This attribute is not used during a nested search
> +     */
> +    protected String userRoleAttribute = null;
> +
>
>      /**
>       * A string of LDAP user patterns or paths, ":"-separated
> @@ -829,6 +838,14 @@ public class JNDIRealm extends RealmBase
>      }
>
>
> +    public String getUserRoleAttribute() {
> +        return userRoleAttribute;
> +    }
> +
> +    public void setUserRoleAttribute(String userRoleAttribute) {
> +        this.userRoleAttribute = userRoleAttribute;
> +    }
> +
>      /**
>       * Return the message format pattern for selecting users in this Realm.
>       */
> @@ -839,6 +856,8 @@ public class JNDIRealm extends RealmBase
>      }
>
>
> +
> +
>      /**
>       * Set the message format pattern for selecting users in this Realm.
>       * This may be one simple pattern, or multiple patterns to be tried,
> @@ -1230,6 +1249,9 @@ public class JNDIRealm extends RealmBase
>              list.add(userPassword);
>          if (userRoleName != null)
>              list.add(userRoleName);
> +        if (userRoleAttribute != null) {
> +            list.add(userRoleAttribute);
> +        }
>          String[] attrIds = new String[list.size()];
>          list.toArray(attrIds);
>
> @@ -1265,7 +1287,7 @@ public class JNDIRealm extends RealmBase
>
>          // If no attributes are requested, no need to look for them
>          if (attrIds == null || attrIds.length == 0) {
> -            return new User(username, dn, null, null);
> +            return new User(username, dn, null, null,null);
>          }
>
>          // Get required attributes from user entry
> @@ -1283,12 +1305,17 @@ public class JNDIRealm extends RealmBase
>          if (userPassword != null)
>              password = getAttributeValue(userPassword, attrs);
>
> +        String userRoleAttrValue = null;
> +        if (userRoleAttribute != null) {
> +            userRoleAttrValue = getAttributeValue(userRoleAttribute, attrs);
> +        }
> +
>          // Retrieve values of userRoleName attribute
>          ArrayList<String> roles = null;
>          if (userRoleName != null)
>              roles = addAttributeValues(userRoleName, attrs, roles);
>
> -        return new User(username, dn, password, roles);
> +        return new User(username, dn, password, roles, userRoleAttrValue);
>      }
>
>
> @@ -1427,12 +1454,17 @@ public class JNDIRealm extends RealmBase
>          if (userPassword != null)
>              password = getAttributeValue(userPassword, attrs);
>
> +        String userRoleAttrValue = null;
> +        if (userRoleAttribute != null) {
> +            userRoleAttrValue = getAttributeValue(userRoleAttribute, attrs);
> +        }
> +
>          // Retrieve values of userRoleName attribute
>          ArrayList<String> roles = null;
>          if (userRoleName != null)
>              roles = addAttributeValues(userRoleName, attrs, roles);
>
> -        return new User(username, dn, password, roles);
> +        return new User(username, dn, password, roles, password);

The above line is likely wrong. The last argument should not be "password".

>      }
>
>
> @@ -1675,6 +1707,7 @@ public class JNDIRealm extends RealmBase
>
>          String dn = user.getDN();
>          String username = user.getUserName();
> +        String userRoleId = user.getUserRoleId();
>
>          if (dn == null || username == null)
>              return (null);
> @@ -1702,7 +1735,7 @@ public class JNDIRealm extends RealmBase
>              return (list);
>
>          // Set up parameters for an appropriate search
> -        String filter = roleFormat.format(new String[] { 
> doRFC2254Encoding(dn), username });
> +        String filter = roleFormat.format(new String[] { 
> doRFC2254Encoding(dn), username, userRoleId });
>          SearchControls controls = new SearchControls();
>          if (roleSubtree)
>              controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
> @@ -1775,7 +1808,7 @@ public class JNDIRealm extends RealmBase
>                  Map<String, String> newThisRound = new HashMap<String, 
> String>(); // Stores the groups we find in this iteration
>
>                  for (Entry<String, String> group : newGroups.entrySet()) {
> -                    filter = roleFormat.format(new String[] { 
> group.getKey(), group.getValue() });
> +                    filter = roleFormat.format(new String[] { 
> group.getKey(), group.getValue(), group.getValue() });
>
>                      if (containerLog.isTraceEnabled()) {
>                          containerLog.trace("Perform a nested group search 
> with base "+ roleBase + " and filter " + filter);
> @@ -2359,9 +2392,11 @@ public class JNDIRealm extends RealmBase
>          private final String dn;
>          private final String password;
>          private final List<String> roles;
> +        private final String userRoleId;
> +
>
>          public User(String username, String dn, String password,
> -                List<String> roles) {
> +                List<String> roles, String userRoleId) {
>              this.username = username;
>              this.dn = dn;
>              this.password = password;
> @@ -2370,6 +2405,7 @@ public class JNDIRealm extends RealmBase
>              } else {
>                  this.roles = Collections.unmodifiableList(roles);
>              }
> +            this.userRoleId = userRoleId;
>          }
>
>          public String getUserName() {
> @@ -2387,6 +2423,12 @@ public class JNDIRealm extends RealmBase
>          public List<String> getRoles() {
>              return roles;
>          }
> +
> +        public String getUserRoleId() {
> +            return userRoleId;
> +        }
> +
> +
>      }
>  }
>
>(...)

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to