Laravel 5.0 multiauth

时间:2017-08-14 09:46:02

标签: php laravel-5

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

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

如何在管理员登录时保持此状态,管理员可以查看客户端的完整数据?

5 个答案:

答案 0 :(得分:3)

让我介绍一下拥有asuser功能的最简单方法。首先,定义returnbackRoute::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

是否可以投放生产

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

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

嗯,希望它有用。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

我建议您将视图逻辑分开,例如业务逻辑进入一些公共层,而不是做一个" login-as-client"功能。尽管它看起来像是一个捷径,但你还是要考虑很多事情。

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

我会做什么:

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

  2. 实施一个箴言role-based ACLplentypackages。在您的示例中,您将拥有admin角色和client角色,例如,都有权限对象view-client-profile

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

答案 4 :(得分:1)

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

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

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