vanrezzen/laravel-account-portal

该包已被放弃且不再维护。未建议替代包。

快速切换到您的Laravel应用的用户账户

1.1.0 2022-06-06 12:35 UTC

This package is auto-updated.

Last update: 2022-09-04 20:57:17 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

🌌 快速切换到您的Laravel应用的用户账户进行调试、测试等。

此包允许您的管理员或支持人员轻松登录到任何用户账户,以查看您的应用及其数据。

在底层,此包仅通过将原始账户信息保存在会话中,简单地登录到门户用户账户,以便您切换回来。

关于

在构建系统时,我发现我们在几乎所有产品中都构建了相同的功能

我们创建了一个简单的页面、按钮或API,支持人员或开发人员可以输入用户的电子邮件或搜索用户列表,并使用该用户的账户登录到我们的应用。在一些其他应用中,我也看到了类似的功能,甚至是更差的“主密码”,可以输入为登录每个账户的密码,而不需要进一步验证。

当用户抱怨某些功能不工作或有关于他们账户中创建的数据的问题时,此功能很有用,这样我们就可以以他们相同的方式查看应用。

在不同的项目中,此功能可能有不同的名称——账户门户、访客视图、用户视图、支持视图、直接访问、支持登录等——但它们大多以相同的方式工作。

此包试图尽可能无偏见:它不定义固定的API、预构建仪表板或对您的用户模型做出假设。相反,此包试图为操作可认证类和用户会话提供抽象的API。其他所有内容——API、界面或前端中的按钮——都可以根据您的应用程序需求添加。

安装

您可以通过composer安装此包

composer require vantezzen/laravel-account-portal

您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="laravel-account-portal-config"

定义网关

此包要求您定义“use-account-portal”网关,以保护门户功能免受未经授权的使用。

例如,您可能需要在AppServiceProvider中添加此类网关定义

Gate::define("use-account-portal", function (User $currentUser, ?User $portalUser = null) {
    return $currentUser->isAdmin();
});

您的网关应确定用户$currentUser是否被授权打开$portalUser的门户,但请注意,如果检查当前用户是否允许使用此功能,则$portalUser可能是null

用法

此包仅提供了一个类,可以轻松打开和关闭账户门户——您可能需要创建API控制器或类似的内容,以满足您应用的需求。

获取实例

要控制门户,您需要一个“Vantezzen\LaravelAccountPortal\LaravelAccountPortal”类的实例。您可以使用Laravel的依赖注入或手动创建该类。

// Use Laravel's dependency injection
class MyController extends Controller {
    public function index(Vantezzen\LaravelAccountPortal\LaravelAccountPortal $laravelAccountPortal) {
        // ...
    }
}

// ...or...

// Create manually
$laravelAccountPortal = new Vantezzen\LaravelAccountPortal\LaravelAccountPortal();

会话存储

本包使用当前会话来存储门户信息,但您可以选择实现自己的信息存储方式。

为此,包使用定义了所需函数的 PortalStorage 接口。

默认情况下,您只需将 Laravel 会话包装到 SessionPortalStorage

use \Vantezzen\LaravelAccountPortal\PortalStorage\SessionPortalStorage;

class MyController extends Controller {
    public function index(Request $request) {
        $storage = new SessionPortalStorage($request->session());
    }
}

打开门户

要打开一个账户的门户,只需调用 openPortal 方法。

class MyController extends Controller {
    // Example for a route like "/account-portal/open/{portalUserId}"
    public function openPortal(Request $request, string $portalUserId, LaravelAccountPortal $laravelAccountPortal) {
        $storage = new SessionPortalStorage($request->session());
        
        $laravelAccountPortal->openPortal(
            // Current session object used to store the portal information
            $storage,
            // Current user that wants to open the portal
            $request->user(),
            // User the current user wants to portal into
            User::find($portalUserId)
        );
    }
}

请注意,这将内部自动检查您定义的网关,如果网关拒绝请求,则会抛出 "AccountPortalNotAllowedForUserException"。

关闭门户

要关闭门户,只需用当前会话调用 closePortal

class MyController extends Controller {
    public function closePortal(Request $request, LaravelAccountPortal $laravelAccountPortal) {
        $storage = new SessionPortalStorage($request->session());
        
        $laravelAccountPortal->closePortal(
            // Current session object used to store the portal information
            $storage,
            
            // Get the authenticatable model instance by id
            fn($id) => User::find($id)
        );
    }
}

第二个参数应该是一个 callable,通过其 ID 返回用户模型。内部,此包仅存储打开门户的原始用户 ID,以便在门户关闭后返回账户。为了保持对您的用户模型的不偏不倚,您需要提供此回调来通过保存的 ID 查找模型。

请注意,如果会话当前没有活动门户,这将抛出 "NotInAccountPortalException"。

门户状态

要检查门户的当前状态,可以使用辅助方法 isInPortalcanUsePortal

$storage = new SessionPortalStorage($request->session());
      
// True if the session has information about being in a portal
$isInPortal = $laravelAccountPortal->isInPortal($storage);

// True if a portal can be opened into the portal user
// Please note that "$portalUser" might be left as null to check generally
$canUsePortal = $laravelAccountPortal->canUsePortal($storage, $portalUser);

根据这些参数,您可能需要在前端显示“打开账户门户”、“关闭账户门户”按钮或没有任何按钮。

多层门户

请注意,由于安全和复杂性原因,用户不能在已经打开门户时再打开一个门户。

如果用户目前在一个门户中,canUsePortal 将始终返回 false,这使得打开更多门户成为不可能。

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 变更日志

贡献

有关详细信息,请参阅 贡献指南

安全漏洞

请查阅 我们的安全策略,了解如何报告安全漏洞。

致谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 以获取更多信息。