我有一个应用程序,它有两个部分后端和前端。在后端管理员可以登录,在前端客户端可以登录。现在它已经实现。所有应用程序的查询都是通过管理员和客户端的登录用户ID完成的。
现在我的应用需要一种功能,管理员可以像客户端一样查看客户端数据,看看他们的个人资料。客户端有很多东西。我可以使用Auth::loginUsingId($client_id)
。此处客户端配置文件显示完美,但管理员登录会话已按预期丢失。
如何在管理员登录时保持此状态,管理员可以查看客户端的完整数据?
答案 0 :(得分:3)
让我介绍一下拥有asuser
功能的最简单方法。首先,定义returnback
和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
是否可以投放生产
不,不是。这不是一个很好的解决方案,它只是一瞥如何使用它。会话具有生命周期,因此如果管理员在其生命周期内没有返回,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
?这只是一个例子。
我会做什么:
将会话中的视图(例如用户配置文件,用户内容等)分开,以便通过URL中的ID或其他任何方法访问它,而不是通过当前登录的用户ID访问。
实施一个箴言role-based ACL。 plenty已packages。在您的示例中,您将拥有admin
角色和client
角色,例如,都有权限对象view-client-profile
。
最后,这可能需要花费更多的时间进行开发,但是通过电话上愤怒的客户端可以为您节省一些时间进行调试/故障排除。希望有所帮助。
答案 4 :(得分:1)
我认为中间件是过滤管理员和普通用户之间内容的最佳选择,因为中间件中的代码在任何函数调用之前运行。
您只需在会话中设置usertype并相应地进行过滤。