首页 文章

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

提问于
浏览
1

在Laravel 5.3中构建应用程序,其中一项功能是让管理员能够以用户身份登录应用程序,以便能够查看特定用户可以看到的内容,同时保持其管理员会话能够返回到用户列表,可以作为另一个用户登录,而无需重新进行身份验证 .

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

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

你们对这个解决方案有什么编程逻辑思路?试图找到关于如何在Laravel 5.x中实现这一点的其他意见/想法

3 回答

  • 1

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

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

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

  • 0

    我最近在一个项目上实现了这个功能 . 我使用会话和中间件做到了这一点 . 我就这样做了:

    • 为此目的创建一个控制器'ImpersonateController'并为 impersonateInimpersonateOut 设置两个路由 .
    Route::get('impersonateIn/{user}', 'ImpersonateController@impersonateIn');
    Route::get('impersonateOut', 'ImpersonateController@impersonateOut');
    
    • ImpersonateController@impersonateIn 方法中,只需将要登录的用户ID和URL backUrl设置为会话变量 .
    public function impersonateIn($id)
    {
        session(['impersonated' => $id, 'backUrl' => \URL::previous()]);
    
        return redirect()->to('dashboard');
    }
    
    public function impersonateOut()
    {
    
        $back_url = Request::session()->get('backUrl');
    
        Request::session()->forget('impersonated', 'secretUrl');
    
    
        return $back_url ? 
            redirect()->to($back_url) : 
            redirect()->to('dashboard');
    }
    

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

    • 创建一个中间件来检查handle方法的会话 . 如果发现 impersonated ,则仅以当前请求使用 Auth::onceUsingId() 的用户身份登录 .
    class ImpersonateMiddleware
    {
        public function handle($request, Closure $next)
        {
            if(Request::session()->has('impersonated'))
            {
                Auth::onceUsingId(Request::session()->get('impersonated'));
                }
    
         }
    }
    
    • 现在您只需要为每个请求应用中间件 . 从Http / Kernel.php执行此操作的最佳位置
    protected $middlewareGroups = [
    
        'web' => [
    
            //....
    
           \App\Http\Middleware\ImpersonateMiddleware::class,
        ],
    ];
    
    • 唯一剩下的就是你需要检查会话并将 logout 路由替换为 impersonateOut . 现在,从用户注销的管理员将被重定向到旧路由 . 而已!
  • 1

    Personaly,我会用会话这样做 . 我没有使用Laravel,但我经常使用PHP,所以我的答案将在PHP中 .
    在 Headers 页中,您最有可能进行某种会话检查以查看用户是否已登录 . 例如:

    <? php
     session_start();
     if (isset($_SESSION['user'])){
     //do stuff with the user session
     } else {
     die('User not logged in!');
     }
     ?>
    

    我会改变这样的:

    <? 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”并返回旧的会话管理员权限而无需登录又回来了 .

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

相关问题