繁体   English   中英

Laravel 5.0 multiauth

[英]Laravel 5.0 multiauth

我有一个应用程序,它有两个部分后端和前端。 在后端管理员可以登录,在前端客户端可以登录。现在它已经实现。 所有应用程序的查询都是通过管理员和客户端的登录用户ID完成的。

现在我的应用程序需要一个功能,管理员可以查看客户端数据,就像客户端查看他们的个人资料一样。客户端有很多东西。 我可以使用Auth::loginUsingId($client_id) 这里客户端配置文件显示完美,但管理员登录会话按预期丢失。

管理员登录时如何实现这一点,管理员可以查看客户端的完整数据?

让我介绍一种最简单的login as client功能。 首先,定义asuserreturnback路由。

路线和行动

Route::get('/asuser/{user}', 'AdminController@asuser')
        ->where('user', '[0-9]+')
        ->name('asuser');
Route::get('/returnback', 'ClientController@returnback')
        ->name('returnback');

在管理员的控制器中:

public function asuser(User $client, Request $request) {
    /* insert checking if user has right either here with some field 
     * like $user->is_admin or using middleware settings and Policy
     */
    # who user is
    $fromId = Auth::user()->getId();

    # logging as a client
    Auth::login($client, true);

    # but keeping admin in a session
    $request->session()->put('adm_id', $fromId);

    return redirect()->route('some-client-route')
                    ->with('status', 'You are logged in as a client');
}

并返回ClientController

public function returnback(Request $request) {
    $fromId = Auth::user()->getId();

    # getting admin id
    $admId = $request->session()->pull('adm_id');
    $adminUser = User::find($admId);

    if (!$adminUser) {
        return redirect()->back()
                        ->with('status', 'Not allowed');
    }

    # logging out as a client and logging in as admin
    Auth::logout();
    Auth::login($adminUser, true);

    return redirect()->route('some-admin-route')
                    ->with('status', 'Welcome back!');
}

它准备好生产了吗?

不,这不对。 这不是一个很好的解决方案,只是一瞥如何使用它。 会话具有生命周期,因此如果管理员在其生命周期中没有返回, 会话变量将丢失并且他将成为客户端(如果remember me = true,则如上面的代码中所示)。 您可以将值存储在会话中但不存储在数据库列中。

此外,正如t1gor所提到的,您必须注意以下事实:当管理员是客户端时,您无法记录客户端的操作并发送事件。 这是作为客户端登录的最严重问题。 无论如何,我想,解决这个问题要比将所有auth逻辑移出视图更容易。

好吧,希望它有所帮助。

我认为管理客户端/用户配置文件的一个好方法是在后端实现用户管理部分,在那里显示和编辑用户及其配置文件。

Laravel不提供混合会话。 您一次只能作为一个用户进行身份验证。 如果你真的需要Laravel 5.0中的这种功能,你可以通过hackish用户乒乓来解决这个问题(例如,暂时登录为客户端并在之后切换回管理员)。

但似乎您的问题更多是与Authorization相关的(与Authentication相反)。 Laravel在v5.1.11中实现了授权层。 由于不再支持v5.0,因此无论此功能如何,都应更新。

您可以在官方文档中找到有关授权的更多信息: https//laravel.com/docs/5.1/authorization

我宁愿建议您将视图逻辑(例如业务逻辑)分成一些公共层,而不是执行“登录作为客户端”功能。 尽管看起来像是一个捷径,但你还是要考虑很多事情。

例如,您现在如何记录应用程序事件? 在会话有adm_id添加一个检查并记录而不是userId吗? 这只是一个例子。

我会做什么:

  1. 将会话中的视图(例如用户配置文件,用户内容等)分开,以便通过URL中的ID或其他任何方法访问它,而不是通过当前登录的用户ID访问。

  2. 实现基于角色的propper ACL 已经有很多 在您的示例中,您将拥有admin角色和client角色,例如,havin权限对象view-client-profile

最后,这可能需要花费更多的时间进行开发,但是可以通过电话让愤怒的客户端进行调试/故障排除。 希望有所帮助。

我认为中间件是过滤管理员和普通用户之间内容的最佳选择,因为中间件中的代码在任何函数调用之前运行。

您只需在会话中设置usertype并相应地进行过滤。

访问: https//laravel.com/docs/5.4/middleware

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM