[英]Laravel 5.0 multiauth
我有一个应用程序,它有两个部分后端和前端。 在后端管理员可以登录,在前端客户端可以登录。现在它已经实现。 所有应用程序的查询都是通过管理员和客户端的登录用户ID完成的。
现在我的应用程序需要一个功能,管理员可以查看客户端数据,就像客户端查看他们的个人资料一样。客户端有很多东西。 我可以使用Auth::loginUsingId($client_id)
。 这里客户端配置文件显示完美,但管理员登录会话按预期丢失。
管理员登录时如何实现这一点,管理员可以查看客户端的完整数据?
让我介绍一种最简单的login as client
功能。 首先,定义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
= 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
吗? 这只是一个例子。
我会做什么:
将会话中的视图(例如用户配置文件,用户内容等)分开,以便通过URL中的ID或其他任何方法访问它,而不是通过当前登录的用户ID访问。
实现基于角色的propper ACL 。 已经有很多 包 。 在您的示例中,您将拥有admin
角色和client
角色,例如,havin权限对象view-client-profile
。
最后,这可能需要花费更多的时间进行开发,但是可以通过电话让愤怒的客户端进行调试/故障排除。 希望有所帮助。
我认为中间件是过滤管理员和普通用户之间内容的最佳选择,因为中间件中的代码在任何函数调用之前运行。
您只需在会话中设置usertype并相应地进行过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.