向loginController添加逻辑

时间:2020-01-04 18:30:25

标签: php laravel vue.js authentication

我想添加逻辑以在用户登录用户的第一个配置文件ID时创建一个profile_id cookie。

setcookie("profile_id", Auth::user()->profiles[0]->id,  time() + 86400, "/"); 

我已将此行放置在其他控制器中,所以我知道该部分可以工作,但是由于没有方法(更新/创建/等)可将该逻辑放入其中,因此我似乎无法“破解” loginController。

<?php

namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;


class LoginController extends Controller
{
    use AuthenticatesUsers;
    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/settings';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');

    }
}

我不确定此控制器正在发生什么,并且似乎无法弄清楚它是如何工作或正在做什么。任何理解该代码的指针或指导将不胜感激。

  • 我选择不使用cookieController,因为该行有效,并且是该应用程序唯一需要的cookie。

  • 如果功能的上下文对我有一个拥有许多配置文件的用户有用,则导航栏具有一个下拉菜单以选择活动的配置文件。导航栏(未下拉)显示基于profile_id cookie的当前所选用户。当用户首次登录时,没有选择任何配置文件,并且不存在profile_id cookie,因此它在登录时会中断。我通过重定向到没有导航栏的页面和一个逻辑块来解决这个问题,该逻辑块说如果不存在cookie,则创建一个cookie,但这不是一个长期的解决方案。

3 个答案:

答案 0 :(得分:0)

有关AuthenticatesUsers特性中包含的所有功能,请参见https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php

例如,您可以像这样覆盖login函数:

LoginController.php

use AuthenticatesUsers {
    // Rename one function to another name, so we can use the original name ourselves.
    login as loginTrait;
}

public function login(Request $request)
{
    // And here you can put your own logic, a good starting point is
    // the source (the `AuthenticatesUsers::login()` function).

    // Call the original function.
    $this->loginTrait($request);
}

此外,还有一个protected function authenticated(Request $request, $user)定义,您可以自由覆盖。验证用户身份后将调用此方法。

答案 1 :(得分:0)

我将覆盖authenticated方法,并在其中添加您的逻辑:

 /**
     * The user has been authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  mixed  $user
     * @return mixed
     */
    protected function authenticated(Request $request, $user)
    {
        redirect()->intended($this->redirectPath())->cookie(
            'profile_id', $user->profiles[0]->id, now()->addSeconds(86400)
        );
    }

之所以起作用,是因为一旦通过身份验证,它将击中sendLoginResponse(在Trait中定义),并调用authenticated函数。该函数默认为空,因此它返回null并触发null coalesce中的sendLoginResponse比较。我们在这里所做的是复制该方法的逻辑,并添加了一个cookie以与响应一起返回。

答案 2 :(得分:0)

AuthenticatesUsers::sendLoginResponse在验证用户身份后返回RedirectResponse

一种直接的方法是覆盖sendLoginResponse并通过ResponseTrait::cookie将cookie包含在原始响应标头中。

use Symfony\Component\HttpFoundation\Cookie;

class LoginController extends Controller
{
    use AuthenticatesUsers;
    #...

    /**
    * Send the response after the user was authenticated.
    *
    * @param  \Illuminate\Http\Request  $request
    * @return \Illuminate\Http\Response
    */
    protected function sendLoginResponse(Request $request)
    {
        return parent::sendLoginResponse($request)
               ->cookie(
                   new Cookie(
                      "profile_id",
                      Auth::user()->profiles[0]->id,
                      time() + 86400,
                      "/"
                  )
              );
    }
}