我有一个包含后端和前端两部分的应用程序。后台admin可以登录,前台client可以登录,现在已经实现了。所有应用程序的查询都是通过在管理员和客户端登录的用户 ID 完成的。
现在我的应用程序需要一个功能,管理员可以在其中查看客户数据,就像客户查看他们的个人资料一样。客户端有很多东西。我可以使用 Auth::loginUsingId($client_id)
。此处客户端配置文件显示完美,但管理员登录 session 按预期丢失。
如何在保留管理员登录名且管理员可以看到客户端完整数据的情况下实现这一点?
最佳答案
让我介绍一下拥有login as client
功能的最简单方法。首先,定义 asuser
和 returnback
路由。
路线和行动
Route::get('/asuser/{user}', 'AdminController@asuser')
->where('user', '[0-9]+')
->name('asuser');
Route::get('/returnback', 'ClientController@returnback')
->name('returnback');
在管理员的 Controller 中:
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!');
}
是否准备好投入生产
不,不是。这不是一个很好的解决方案,只是简单介绍一下如何使用它。 session 有生命周期,所以如果管理员在其生命周期内没有返回,session variables are lost然后他成为客户(如果 remember me
=true,如上面的代码所示)。您可以不将值存储在 session 中,而是存储在数据库列中。
除了t1gor提到的,你必须注意一个事实,当admin是一个客户端时,你不能记录客户端的操作和发送事件。这是作为客户端登录的最严重的问题。无论如何,我想,解决这个问题比将所有身份验证逻辑移出 View 要容易得多。
嗯,希望对你有帮助。
关于php - Laravel 5.0 多认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45671751/