首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理员在Laravel 5.3中以用户身份登录的功能

管理员在Laravel 5.3中以用户身份登录的功能
EN

Stack Overflow用户
提问于 2016-09-06 22:03:57
回答 3查看 3K关注 0票数 1

在Laravel 5.3中构建一个应用程序,其中一个功能是让管理员能够以用户身份登录到应用程序,能够看到特定用户可以看到的内容,同时维护他的管理会话,以便能够返回到用户列表,并且能够以另一个用户的身份登录,而无需重新验证。

目前实现了基本的开箱即用的Laravel身份验证,这意味着如果我启动另一个身份验证会话,它将终止我的管理会话,使我不得不重新登录。

我检查了Laravel Multi Auth,但似乎使用两个表( user,admin),在我的例子中,我们使用一个用户表,并使用ACL来管理角色和决定谁是admin,谁是用户。

你们对这个解决方案有什么编程逻辑的想法?尝试寻找如何在Laravel 5.x中实现此功能的其他观点/想法

EN

回答 3

Stack Overflow用户

发布于 2017-11-30 03:39:22

我最近在一个项目中实现了这个特性。我使用会话和中间件实现了这一点。我是这样做的:

  1. 创建一个控制器'ImpersonateController‘,并为此为impersonateInimpersonateOut设置两个路由。

Route::get('impersonateIn/{ user }','ImpersonateController@impersonateIn');Route::get('impersonateOut','ImpersonateController@impersonateOut');

  • In ImpersonateController@impersonateIn方法只需设置要登录的用户id和backUrl到会话变量中。

公共函数impersonateIn($id) { session('impersonated‘=> $id,'backUrl’=> \URL::previous());return redirect()->to('dashboard');}公共函数impersonateOut() { $back_url = Request::session()->get('backUrl');Request::session()->forget('impersonated','secretUrl');返回$back_url?redirect()->to($back_url):redirect()->to('dashboard');}

第一部分已经完成。现在,每个请求都需要检查会话是否设置了impersonated变量。一个很好的地方就是中间件。

  1. 创建一个中间件来检查handle方法上的会话。如果找到impersonated,则仅以使用当前请求的Auth::onceUsingId()的用户身份登录。

ImpersonateMiddleware { public function handle($request,Closure $next) { if( request ::session()->has('impersonated')) {$request}

  • 现在您只需要为每个请求应用中间件。在Http/Kernel.php中执行此操作的最佳位置

protected $middlewareGroups =[ 'web‘=> //....\App\Http\Middleware\ImpersonateMiddleware::class,,];

  • 剩下的唯一一件事就是您需要检查会话并替换到impersonateOut注销路由。现在,当管理员从用户注销时,将重定向到旧路由。就是这样!
票数 3
EN

Stack Overflow用户

发布于 2016-09-07 01:28:49

您确定真的要登录吗?我将保持以管理员身份登录,并模拟用户登录。您可以允许管理员访问所有数据库。在您的控制器中,您可以使用User::find($user_id)而不是Auth::user()来访问用户数据。

https://laravel.com/docs/5.3/database

https://laravel.com/docs/5.3/eloquent

票数 1
EN

Stack Overflow用户

发布于 2016-09-06 22:24:11

就我个人而言,我会用会话来做这件事。我没有使用过Laravel,但我经常使用PHP,所以我的答案是PHP。

在标题页中,您很可能有某种类型的会话检查,以查看用户是否已登录。例如:

代码语言:javascript
复制
<? php
 session_start();
 if (isset($_SESSION['user'])){
 //do stuff with the user session
 } else {
 die('User not logged in!');
 }
 ?>

我会将其更改为类似以下内容:

代码语言:javascript
复制
<? php
 session_start();
 if (isset($_SESSION['fakeuser'])){
 //do stuff with the user session
 //change logout button to destroy this session instead of logging the user out
 }
 elseif (isset($_SESSION['user'])){
 //do stuff with the user session
 } else {
 die('User not logged in!');
 }
 ?>

在交换用户的页面中,只需复制用户登录时启动会话的方式即可。要切换用户,您需要销毁新的'fakeuser‘,并且您将返回到旧的session + admin权限,而不必再次登录。

这是我无论如何都会采取的合乎逻辑的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39351025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档