Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Jul 24, 2023. It is now read-only.

Commit 9fe6006

Browse files
Merge pull request #855 from KenoKokoro/user-resolver-lazy-connection
Lazy connection before searching for user while trying to authenticate
2 parents eec3535 + 385f9ba commit 9fe6006

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

‎src/Resolvers/UserResolver.php‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,15 @@ protected function getPasswordFromCredentials($credentials)
201201
*/
202202
protected function getLdapAuthProvider(): ProviderInterface
203203
{
204-
return $this->ldap->getProvider($this->connection ?? $this->getLdapAuthConnectionName());
204+
$provider = $this->ldap->getProvider($this->connection ?? $this->getLdapAuthConnectionName());
205+
206+
if (! $provider->getConnection()->isBound()) {
207+
// We'll make sure we have a bound connection before
208+
// allowing dynamic calls on the default provider.
209+
$provider->connect();
210+
}
211+
212+
return $provider;
205213
}
206214

207215
/**

‎tests/DatabaseProviderTest.php‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
namespace Adldap\Laravel\Tests;
44

55
use Adldap\AdldapInterface;
6+
use Adldap\Connections\ConnectionInterface;
7+
use Adldap\Connections\Provider;
8+
use Adldap\Connections\ProviderInterface;
69
use Adldap\Laravel\Commands\Import;
710
use Adldap\Laravel\Facades\Resolver;
811
use Adldap\Laravel\Tests\Handlers\LdapAttributeHandler;
@@ -13,6 +16,7 @@
1316
use Illuminate\Support\Facades\App;
1417
use Illuminate\Support\Facades\Auth;
1518
use Illuminate\Support\Facades\Hash;
19+
use Mockery as m;
1620

1721
class DatabaseProviderTest extends DatabaseTestCase
1822
{
@@ -89,8 +93,20 @@ public function auth_fails_when_user_not_found()
8993
/** @test */
9094
public function config_scopes_are_applied()
9195
{
96+
$ldapMock = m::mock(AdldapInterface::class);
97+
App::instance(AdldapInterface::class, $ldapMock);
98+
/** @var Provider $provider */
99+
$provider = App::make(Provider::class);
92100
config(['ldap_auth.scopes' => [JohnDoeScope::class]]);
93101

102+
$providerMock = m::mock(ProviderInterface::class);
103+
$connectionMock = m::mock(ConnectionInterface::class);
104+
105+
$providerMock->shouldReceive('getConnection')->once()->andReturn($connectionMock);
106+
$connectionMock->shouldReceive('isBound')->once()->andReturn(true);
107+
$ldapMock->shouldReceive('getProvider')->once()->andReturn($providerMock);
108+
$providerMock->shouldReceive('search')->once()->andReturn($provider->search());
109+
94110
$expectedFilter = '(&(objectclass=75円73円65円72円)(objectcategory=70円65円72円73円6円f6円e)(!(objectclass=63円6円f6円e74円61円63円74円))(cn=4円a6円f68円6円e20円44円6円f65円))';
95111

96112
$this->assertEquals($expectedFilter, Resolver::query()->getQuery());
@@ -219,6 +235,10 @@ public function auth_attempts_fallback_using_config_option()
219235
/** @test */
220236
public function auth_attempts_using_fallback_does_not_require_connection()
221237
{
238+
$ldapMock = m::mock(AdldapInterface::class);
239+
App::instance(AdldapInterface::class, $ldapMock);
240+
/** @var Provider $provider */
241+
$provider = App::make(Provider::class);
222242
config(['ldap_auth.login_fallback' => true]);
223243

224244
EloquentUser::create([
@@ -232,6 +252,14 @@ public function auth_attempts_using_fallback_does_not_require_connection()
232252
'password' => 'Password123',
233253
];
234254

255+
$providerMock = m::mock(ProviderInterface::class);
256+
$connectionMock = m::mock(ConnectionInterface::class);
257+
258+
$providerMock->shouldReceive('getConnection')->times(3)->andReturn($connectionMock);
259+
$connectionMock->shouldReceive('isBound')->times(3)->andReturn(true);
260+
$ldapMock->shouldReceive('getProvider')->times(3)->andReturn($providerMock);
261+
$providerMock->shouldReceive('search')->times(3)->andReturn($provider->search());
262+
235263
$this->assertTrue(Auth::attempt($credentials));
236264

237265
$user = Auth::user();

‎tests/UserResolverTest.php‎

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Adldap\Laravel\Tests;
44

55
use Adldap\AdldapInterface;
6+
use Adldap\Connections\ConnectionInterface;
67
use Adldap\Connections\ProviderInterface;
78
use Adldap\Laravel\Auth\NoDatabaseUserProvider;
89
use Adldap\Laravel\Resolvers\UserResolver;
@@ -85,6 +86,11 @@ public function scopes_are_applied_when_query_is_called()
8586
->shouldReceive('users')->once()->andReturn($builder);
8687

8788
$ad = m::mock(AdldapInterface::class);
89+
$ldapConnection = m::mock(ConnectionInterface::class);
90+
$ldapConnection->shouldReceive('isBound')->once()->andReturn(false);
91+
92+
$provider->shouldReceive('getConnection')->once()->andReturn($ldapConnection);
93+
$provider->shouldReceive('connect')->once();
8894

8995
$ad->shouldReceive('getProvider')->with('default')->andReturn($provider);
9096

@@ -99,8 +105,14 @@ public function connection_is_set_when_retrieving_provider()
99105
Config::shouldReceive('get')->once()->with('ldap_auth.connection', 'default')->andReturn('other-domain');
100106

101107
$ad = m::mock(AdldapInterface::class);
108+
$provider = m::mock(ProviderInterface::class);
102109

103-
$ad->shouldReceive('getProvider')->andReturn(m::mock(ProviderInterface::class))->with('other-domain');
110+
$ad->shouldReceive('getProvider')->with('other-domain')->andReturn($provider);
111+
$ldapConnection = m::mock(ConnectionInterface::class);
112+
$ldapConnection->shouldReceive('isBound')->once()->andReturn(false);
113+
114+
$provider->shouldReceive('getConnection')->once()->andReturn($ldapConnection);
115+
$provider->shouldReceive('connect')->once();
104116

105117
$r = m::mock(UserResolver::class, [$ad])->makePartial();
106118

@@ -130,6 +142,11 @@ public function by_credentials_retrieves_alternate_username_attribute_depending_
130142
->shouldReceive('users')->once()->andReturn($query);
131143

132144
$ad = m::mock(AdldapInterface::class);
145+
$ldapConnection = m::mock(ConnectionInterface::class);
146+
$ldapConnection->shouldReceive('isBound')->once()->andReturn(false);
147+
148+
$ldapProvider->shouldReceive('getConnection')->once()->andReturn($ldapConnection);
149+
$ldapProvider->shouldReceive('connect')->once();
133150

134151
$ad->shouldReceive('getProvider')->once()->andReturn($ldapProvider);
135152

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /