Use the stored user credentials to look up roles
Dagfinn Ilmari Mannsåker [Thu, 19 Feb 2015 19:34:40 +0000 (19:34 +0000)]
Changes
lib/Catalyst/Authentication/Store/LDAP/Backend.pm
lib/Catalyst/Authentication/Store/LDAP/User.pm
t/10-roles-mock.t

diff --git a/Changes b/Changes
index aa3e1e0..92b11c8 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,4 +1,5 @@
   - Escape special characters in user/role names
+  - Use the stored user credentials to look up roles
 
 1.014 26 April 2013
   - Don't fall back to unauthenticated bind when authenticating
index 8e69c59..403b63c 100644 (file)
@@ -378,7 +378,8 @@ sub lookup_roles {
     if ( $self->use_roles == 0 || $self->use_roles =~ /^false$/i ) {
         return undef;
     }
-    $ldap ||= $self->ldap_bind;
+    $ldap ||= $self->role_search_as_user
+        ? $userobj->ldap_connection : $self->ldap_bind;
     my @searchopts;
     if ( defined( $self->role_basedn ) ) {
         push( @searchopts, 'base' => $self->role_basedn );
index ec3fa25..cafeab4 100644 (file)
@@ -144,12 +144,6 @@ sub check_password {
         = $self->store->ldap_bind( undef, $self->ldap_entry->dn, $password,
         'forauth' );
     if ( defined($ldap) ) {
-        if ($self->store->role_search_as_user) {
-            # FIXME - This can be removed and made to use the code below..
-            # Have to do the role lookup _now_, as this is the only time
-            # that we have the user's password/ldap bind..
-            $self->roles($ldap);
-        }
         # Stash a closure which can be used to retrieve the connection in the users context later.
         $_ldap_connection_passwords{refaddr($self)} = $password;
         return 1;
@@ -167,8 +161,7 @@ Returns the results of L<Catalyst::Authentication::Store::LDAP::Backend>'s "look
 
 sub roles {
     my $self = shift;
-    my $ldap = shift;
-    $self->{_roles} ||= [$self->store->lookup_roles($self, $ldap)];
+    $self->{_roles} ||= [$self->store->lookup_roles($self)];
     return @{$self->{_roles}};
 }
 
index 49a7d18..d4a4a43 100644 (file)
@@ -104,7 +104,12 @@ is_deeply(\@binds, [
         'ou=foobar',
         'password',
         'password'
-    ], # Rebind to confirm user _and_ lookup roles;
+    ], # Rebind to confirm user
+    [
+        'ou=foobar',
+        'password',
+        'password'
+    ], # Rebind with user credentials to find roles
     [ undef ], # Second user search
 ], 'Binds as expected');