Skip to content

Commit babc965

Browse files
committed
deactivate expired users on session prolong (#22833)
1 parent df0c97c commit babc965

File tree

4 files changed

+74
-10
lines changed

4 files changed

+74
-10
lines changed

app/code/Magento/Security/Model/Plugin/AuthSession.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@ public function __construct(
7171
*/
7272
public function aroundProlong(Session $session, \Closure $proceed)
7373
{
74-
if (!$this->sessionsManager->getCurrentSession()->isLoggedInStatus() ||
75-
$this->userExpirationManager->isUserExpired($session->getUser()->getId())) {
74+
if (!$this->sessionsManager->getCurrentSession()->isLoggedInStatus()) {
75+
$session->destroy();
76+
$this->addUserLogoutNotification();
77+
return null;
78+
} elseif ($this->userExpirationManager->isUserExpired($session->getUser()->getId())) {
79+
$this->userExpirationManager->deactivateExpiredUsers([$session->getUser()->getId()]);
7680
$session->destroy();
7781
$this->addUserLogoutNotification();
7882
return null;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
4+
5+
<test name="AdminNavigateWhileUserExpiredTest">
6+
<annotations>
7+
<features value="Security"/>
8+
<stories value="Navigate to an admin page after user expiration date passes."/>
9+
<title value="Navigate to an admin page after user expiration date passes"/>
10+
<description value="Navigate to an admin page after user expiration date passes."/>
11+
<testCaseId value="" />
12+
<severity value="CRITICAL"/>
13+
<group value="security"/>
14+
</annotations>
15+
16+
<before>
17+
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
18+
</before>
19+
<after>
20+
<actionGroup ref="logout" stepKey="logout"/>
21+
</after>
22+
23+
<!-- Create user -->
24+
<actionGroup ref="AdminOpenNewUserPageActionGroup" stepKey="openNewUserPage" />
25+
<generateDate date="+2 minute" format="M d, Y g:i:s A" stepKey="expiresDateTime"/>
26+
<actionGroup ref="AdminFillInUserWithExpirationActionGroup" stepKey="fillInNewUserWithValidExpiration">
27+
<argument name="expires_at" value="{$expiresDateTime}"/>
28+
</actionGroup>
29+
<grabValueFrom selector="{{AdminNewUserFormSection.username}}" stepKey="grabUsername"/>
30+
<grabValueFrom selector="{{AdminNewUserFormSection.password}}" stepKey="grabPassword"/>
31+
<scrollToTopOfPage stepKey="scrollToTopOfPage"/>
32+
<click selector="{{AdminNewUserFormSection.userInfoTab}}" stepKey="openUserInfoTab"/>
33+
<actionGroup ref="AdminSaveUserSuccessActionGroup" stepKey="saveNewUserWithValidExpirationSuccess"/>
34+
<actionGroup ref="logout" stepKey="logout"/>
35+
36+
<!-- Login as that user -->
37+
<actionGroup ref="LoginAdminWithCredentialsActionGroup" stepKey="loginAsNewAdmin">
38+
<argument name="adminUser" value="{$grabUsername}"/>
39+
<argument name="adminPassword" value="{$grabPassword}"/>
40+
</actionGroup>
41+
<actionGroup ref="AssertAdminDashboardPageIsVisibleActionGroup" stepKey="seeDashboardPage"/>
42+
<wait time="120" stepKey="waitForUserToExpire"/>
43+
<amOnPage url="{{AdminCustomerPage.url}}" stepKey="navigateToCustomers"/>
44+
<!-- Confirm that user is logged out -->
45+
<seeInCurrentUrl url="{{AdminLoginPage.url}}" stepKey="seeAdminLoginUrl"/>
46+
47+
<!-- Delete created user -->
48+
<actionGroup ref="LoginAsAdmin" stepKey="loginAsAdmin"/>
49+
<actionGroup ref="AdminDeleteCustomUserActionGroup" stepKey="deleteUser">
50+
<argument name="user" value="NewAdminUser"/>
51+
</actionGroup>
52+
</test>
53+
</tests>

app/code/Magento/Security/Test/Unit/Model/Plugin/AuthSessionTest.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public function setUp()
7979

8080
$this->userExpirationManagerMock = $this->createPartialMock(
8181
\Magento\Security\Model\UserExpirationManager::class,
82-
['isUserExpired']
82+
['isUserExpired', 'deactivateExpiredUsers']
8383
);
8484

8585
$this->userMock = $this->createMock(\Magento\User\Model\User::class);
@@ -188,27 +188,31 @@ public function testAroundProlongSessionIsActiveUserIsExpired()
188188
->method('isLoggedInStatus')
189189
->willReturn(true);
190190

191-
$this->authSessionMock->expects($this->once())
191+
$this->authSessionMock->expects($this->exactly(2))
192192
->method('getUser')
193193
->willReturn($this->userMock);
194194

195-
$this->userMock->expects($this->once())
195+
$this->userMock->expects($this->exactly(2))
196196
->method('getId')
197197
->willReturn($adminUserId);
198198

199+
$this->requestMock->expects($this->once())
200+
->method('getParam')
201+
->with('isAjax')
202+
->willReturn(false);
203+
199204
$this->userExpirationManagerMock->expects($this->once())
200205
->method('isUserExpired')
201206
->with($adminUserId)
202207
->willReturn(true);
203208

209+
$this->userExpirationManagerMock->expects($this->once())
210+
->method('deactivateExpiredUsers')
211+
->with([$adminUserId]);
212+
204213
$this->authSessionMock->expects($this->once())
205214
->method('destroy');
206215

207-
$this->requestMock->expects($this->once())
208-
->method('getParam')
209-
->with('isAjax')
210-
->willReturn(false);
211-
212216
$this->adminSessionsManagerMock->expects($this->once())
213217
->method('getLogoutReasonMessage')
214218
->willReturn($errorMessage);

dev/tests/integration/testsuite/Magento/Security/Model/Plugin/AuthSessionTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public function testProcessProlongWithExpiredUser()
156156

157157
$expireDate = new \DateTime();
158158
$expireDate->modify('-10 days');
159+
/** @var \Magento\User\Model\User $user */
159160
$user = $this->objectManager->create(\Magento\User\Model\User::class);
160161
$user->loadByUsername(\Magento\TestFramework\Bootstrap::ADMIN_NAME);
161162
$userExpirationFactory = $this->objectManager->create(\Magento\Security\Model\UserExpirationFactory::class);
@@ -178,5 +179,7 @@ public function testProcessProlongWithExpiredUser()
178179
$this->adminSessionInfo->load($sessionId, 'session_id');
179180
$this->authSession->prolong();
180181
static::assertFalse($this->auth->isLoggedIn());
182+
$user->reload();
183+
static::assertFalse((bool)$user->getIsActive());
181184
}
182185
}

0 commit comments

Comments
 (0)