Skip to content

Commit 72578cf

Browse files
authored
Merge pull request #6 from jomweb/use-auth-config
Improvements
2 parents 61de1da + 2e928f6 commit 72578cf

File tree

4 files changed

+62
-15
lines changed

4 files changed

+62
-15
lines changed

phpunit.xml.dist

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<ini name="apc.enable_cli" value="1"/>
1212
<!-- E_ALL => 32767 -->
1313
<!-- E_ALL & ~E_USER_DEPRECATED => 16383 -->
14-
<ini name="error_reporting" value="16383"/>
14+
<ini name="error_reporting" value="32767"/>
1515
</php>
1616

1717
<!-- Add any additional test suites you want to run here -->
@@ -36,8 +36,5 @@
3636
<whitelist>
3737
<directory suffix=".php">src/</directory>
3838
</whitelist>
39-
<blacklist>
40-
<directory suffix=".ctp">src/Template/</directory>
41-
</blacklist>
4239
</filter>
4340
</phpunit>

src/Controller/Component/ImpersonateComponent.php

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace CakeImpersonate\Controller\Component;
1111

1212
use Cake\Controller\Component;
13-
use Cake\ORM\Entity;
13+
use Cake\Event\Event;
1414

1515
/**
1616
* Impersonate component
@@ -23,24 +23,29 @@ class ImpersonateComponent extends Component
2323
*
2424
* @var array
2525
*/
26-
protected $_defaultConfig = [];
26+
protected $_defaultConfig = [
27+
'userModel' => 'Users',
28+
'finder' => 'all',
29+
];
2730

2831
/**
2932
* Function impersonate
3033
*
31-
* @param mixed $id
34+
* @param mixed $id ID of user to impersonate
3235
* @return bool
36+
* @throws \Exception If userModal is not loaded in the Controller
3337
*/
3438
public function login($id)
3539
{
36-
$this->getController()->loadModel('Users');
40+
$userModel = $this->getConfig('userModal', 'Users');
41+
$this->getController()->loadModel($userModel);
3742

38-
$originalAuth = $this->getController()->getRequest()->getSession()->read('Auth');
39-
40-
/** @var Entity $users */
41-
$users = $this->getController()->Users->get($id);
42-
$this->getController()->Auth->setUser($users->toArray());
43-
$this->getController()->getRequest()->getSession()->write('OriginalAuth', $originalAuth);
43+
$finder = $this->getConfig('finder');
44+
/** @var \Cake\ORM\Table $userTable */
45+
$userTable = $this->getController()->{$userModel};
46+
$userArray = $userTable->find($finder)->where([$userTable->getAlias() . '.id' => $id])->firstOrFail()->toArray();
47+
$this->getController()->Auth->setUser($userArray);
48+
$this->getController()->getRequest()->getSession()->write('OriginalAuth', $this->getController()->getRequest()->getSession()->read('Auth'));
4449

4550
return true;
4651
}
@@ -54,7 +59,6 @@ public function login($id)
5459
public function isImpersonate()
5560
{
5661
if ($this->getController()->getRequest()->getSession()->read('OriginalAuth')) {
57-
5862
return true;
5963
}
6064

@@ -78,4 +82,35 @@ public function logout()
7882

7983
return true;
8084
}
85+
86+
/**
87+
* {@inheritdoc}
88+
*/
89+
public function implementedEvents()
90+
{
91+
$eventMap = [
92+
'Controller.initialize' => 'updateConfig',
93+
'Controller.startup' => 'updateConfig',
94+
];
95+
$events = [];
96+
foreach ($eventMap as $event => $method) {
97+
if (method_exists($this, $method)) {
98+
$events[$event] = $method;
99+
}
100+
}
101+
102+
return $events;
103+
}
104+
105+
/**
106+
* Updates the userModel and finder based on the AuthComponent.
107+
*
108+
* @param Event $event Event that started the update.
109+
* @return void
110+
*/
111+
public function updateConfig(Event $event)
112+
{
113+
$this->setConfig('userModel', $this->getController()->Auth->getConfig('authorize.all.userModel', $this->getConfig('userModel')));
114+
$this->setConfig('finder', $this->getController()->Auth->getConfig('authorize.all.finder', $this->getConfig('finder')));
115+
}
81116
}

tests/TestCase/Controller/Component/ImpersonateComponentTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,19 @@ public function testLogout()
9090
*/
9191
public function testLogin()
9292
{
93+
$this->Impersonate->getRequest()->getSession()->write('Auth', $this->Auth);
94+
$this->assertTrue($this->Impersonate->Impersonate->login(1));
95+
96+
$this->assertEquals($this->Auth, $this->Impersonate->getRequest()->getSession()->read('OriginalAuth'));
97+
}
98+
99+
/**
100+
* @return void
101+
* @expectedException \Exception
102+
*/
103+
public function testLoginException()
104+
{
105+
$this->Impersonate->Impersonate->setConfig('userModal', 'UserNotFound');
93106
$this->Impersonate->getRequest()->getSession()->write('Auth', $this->Auth);
94107
$this->assertTrue($this->Impersonate->Impersonate->login(2));
95108

tests/test_app/Controller/ImpersonateTestController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Use Controller instead of AppController to avoid conflicts
1515
*
1616
* @property \CakeImpersonate\Controller\Component\ImpersonateComponent $Impersonate
17+
* @property \App\Model\Table\UsersTable $Users
1718
*/
1819
class ImpersonateTestController extends Controller
1920
{
@@ -24,6 +25,7 @@ class ImpersonateTestController extends Controller
2425
public function initialize()
2526
{
2627
$this->loadComponent('Auth');
28+
$this->loadModel('Users');
2729
$this->loadComponent('CakeImpersonate.Impersonate');
2830
parent::initialize();
2931
}

0 commit comments

Comments
 (0)