Implemented easy impersonation of backend users controlled by the backend.impersonate_users permission

This commit is contained in:
Luke Towers 2019-05-09 10:36:46 -06:00
parent 7fc01bb9ca
commit a1e6849a71
8 changed files with 59 additions and 3 deletions

View File

@ -146,6 +146,10 @@ class ServiceProvider extends ModuleServiceProvider
'label' => 'system::lang.permissions.manage_other_administrators', 'label' => 'system::lang.permissions.manage_other_administrators',
'tab' => 'system::lang.permissions.name' 'tab' => 'system::lang.permissions.name'
], ],
'backend.impersonate_users' => [
'label' => 'system::lang.permissions.impersonate_users',
'tab' => 'system::lang.permissions.name',
],
'backend.manage_preferences' => [ 'backend.manage_preferences' => [
'label' => 'system::lang.permissions.manage_preferences', 'label' => 'system::lang.permissions.manage_preferences',
'tab' => 'system::lang.permissions.name' 'tab' => 'system::lang.permissions.name'

View File

@ -120,7 +120,12 @@ class Auth extends Controller
*/ */
public function signout() public function signout()
{ {
BackendAuth::logout(); if (BackendAuth::isImpersonator()) {
BackendAuth::stopImpersonate();
} else {
BackendAuth::logout();
}
return Backend::redirect('backend'); return Backend::redirect('backend');
} }

View File

@ -130,6 +130,24 @@ class Users extends Controller
return Redirect::refresh(); return Redirect::refresh();
} }
/**
* Impersonate this user
*/
public function update_onImpersonateUser($recordId)
{
if (!$this->user->hasAccess('backend.impersonate_users')) {
return Response::make(Lang::get('backend::lang.page.access_denied.label'), 403);
}
$model = $this->formFindModelObject($recordId);
BackendAuth::impersonate($model);
Flash::success(Lang::get('backend::lang.account.impersonate_success'));
return Backend::redirect('backend/users/myaccount');
}
/** /**
* My Settings controller * My Settings controller
*/ */

View File

@ -0,0 +1,14 @@
<?php if ($this->user->hasAccess('backend.impersonate_users')): ?>
<div class="loading-indicator-container">
<button
type="button"
data-request="onImpersonateUser"
data-load-indicator="<?= e(trans('backend::lang.account.impersonate_working')) ?>"
data-request-confirm="<?= e(trans('backend::lang.account.impersonate_confirm')) ?>"
class="btn btn-danger oc-icon-user-secret"
style="width: 100%; text-align: center"
>
<?= e(trans('backend::lang.account.impersonate')) ?>
</button>
</div>
<?php endif ?>

View File

@ -45,6 +45,12 @@ return [
'not_found' => "AJAX handler ':name' was not found." 'not_found' => "AJAX handler ':name' was not found."
], ],
'account' => [ 'account' => [
'impersonate' => 'Impersonate user',
'impersonate_confirm' => 'Are you sure you want to impersonate this user? You can revert to your original state by logging out.',
'impersonate_success' => 'You are now impersonating this user',
'impersonate_working' => 'Impersonating...',
'impersonating' => 'Impersonating :full_name',
'stop_impersonating' => 'Stop impersonating',
'signed_in_as' => 'Signed in as :full_name', 'signed_in_as' => 'Signed in as :full_name',
'sign_out' => 'Sign out', 'sign_out' => 'Sign out',
'login' => 'Login', 'login' => 'Login',

View File

@ -76,7 +76,11 @@
<li> <li>
<a href="<?= Backend::url('backend/auth/signout') ?>"> <a href="<?= Backend::url('backend/auth/signout') ?>">
<?= e(trans('backend::lang.account.sign_out')) ?> <?php if (\BackendAuth::isImpersonator()) : ?>
<?= e(trans('backend::lang.account.stop_impersonating')) ?>
<?php else: ?>
<?= e(trans('backend::lang.account.sign_out')) ?>
<?php endif; ?>
</a> </a>
</li> </li>
</ul> </ul>

View File

@ -66,6 +66,10 @@ tabs:
secondaryTabs: secondaryTabs:
fields: fields:
btn_impersonate:
label: ''
context: [update]
type: partial
avatar: avatar:
label: backend::lang.user.avatar label: backend::lang.user.avatar
type: fileupload type: fileupload

View File

@ -429,6 +429,7 @@ return [
'manage_mail_templates' => 'Manage mail templates', 'manage_mail_templates' => 'Manage mail templates',
'manage_mail_settings' => 'Manage mail settings', 'manage_mail_settings' => 'Manage mail settings',
'manage_other_administrators' => 'Manage other administrators', 'manage_other_administrators' => 'Manage other administrators',
'impersonate_users' => 'Impersonate users',
'manage_preferences' => 'Manage backend preferences', 'manage_preferences' => 'Manage backend preferences',
'manage_editor' => 'Manage code editor preferences', 'manage_editor' => 'Manage code editor preferences',
'view_the_dashboard' => 'View the dashboard', 'view_the_dashboard' => 'View the dashboard',